asp.net ExecuteReaderAsync中的异步SQLDataTable-有意义吗?

9njqaruj  于 2023-01-14  发布在  .NET
关注(0)|答案(2)|浏览(151)

我使用的是ASP.NET4.5,设置了<httpRuntime targetFramework="4.5" />
我有一个旧的数据助手库方法,它使用SQLDataAdapter.Fill()返回SQLDatatable。
我想添加一个方法来返回Task(of SQLDatatable)-旧方法的异步等价物。
我的代码如下所示(只包含重要的代码部分):
注:

  • GetConnectionString()返回sql连接字符串
  • GetSqlCmd(...)返回SQLCommand对象
  • LogError()记录任何异常
Using conn As New SqlConnection(GetConnectionString())
    Try
        cmd = GetSqlCmd(strSQL, conn, hash)
        Await conn.OpenAsync().ConfigureAwait(False)

        Using datareader = Await cmd.ExecuteReaderAsync().ConfigureAwait(False)
            userDataTable.Load(datareader)
        End Using

    Catch ex As Exception
        LogError(ex)
    End Try

End Using

并且一旦我将wait添加到库方法调用中,代码就可以在ASP.NET应用程序中工作。
我不太确定的是上面的代码是否有意义.当然SQLDataReader是异步的,但是SQLDataTable.Load(datareader)似乎没有使用ReadAsync(据我所知)...
这一事实是否使上面的代码变得毫无意义-也就是说,"ExecuteReaderAsync without ReadAsync"是毫无意义的?

7kqas0il

7kqas0il1#

这不是毫无意义的。使用异步不是全部或全部都没有。在一个web应用中,异步IO是关于阻塞线程更少。它不需要完全不阻塞线程。
您已经消除了由OpenAsyncExecuteReaderAsync导致的阻塞。排空读取器仍然是同步的。
也就是说,大多数网络应用程序使用异步并没有得到任何好处。例如,它不会神奇地使你的查询更快或增加更多的数据库服务器的容量。所以明智地选择。

w6mmgewl

w6mmgewl2#

它不是“无意义的”,而是帮助特定的代码段更好地扩展。你不必在任何地方都使用它,但是如果你需要提高可扩展性,你应该尽可能多地使用它。
异步不是为了让任何东西更快,而是为了让应用程序更可扩展。this answer说“......大多数Web应用程序根本没有从使用异步中得到任何好处。例如,它不会神奇地让你的查询更快,也不会给数据库服务器增加更多容量”,这充其量是误导(最坏的情况下是完全错误的)。
async中获得最大收益的应用是那些需要可扩展性的应用。下面是关于SO的另一个答案,其中包含更多细节-Not much difference between ASP.NET Core sync and async controller actions
不使用async意味着你的调用被阻塞,等待数据库做一些事情。使用async意味着那些本来被阻塞的线程实际上可以做其他事情。这增加了可伸缩性。微软自己的Bing.com在SqlServer上内部运行,所以当设计和实现正确时,SqlServer在可伸缩性方面没有问题。

相关问题