【问题标题】:Asynchronous SQLDataTable from ExecuteReaderAsync - makes sense?来自 ExecuteReaderAsync 的异步 SQLDataTable - 有意义吗?
【发布时间】:2014-07-29 09:27:08
【问题描述】:

我使用的是 ASP.NET 4.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
    

一旦我将 await 添加到库方法调用中,代码就可以在 ASP.NET 应用程序中运行。

我不太确定的是上面的代码是否有意义。当然 SQLDataReader 是异步的,但 SQLDataTable.Load(datareader) 似乎没有使用 ReadAsync (据我所知)......

这一事实是否使上述代码毫无意义 - 意思是,“ExecuteReaderAsync without ReadAsync”毫无意义?

【问题讨论】:

    标签: asp.net vb.net asynchronous ado.net


    【解决方案1】:

    这不是毫无意义的。使用异步不是全部或全部。在 Web 应用程序中,异步 IO 是关于更少的阻塞线程。根本不需要阻止它们。

    您已经消除了由OpenAsyncExecuteReaderAsync 导致的阻塞。耗尽阅读器仍然是同步的。

    也就是说,大多数网络应用程序根本无法从使用异步中获得任何好处。例如,它不会神奇地使您的查询更快或为数据库服务器增加更多容量。所以明智地选择了。

    【讨论】:

    • 此异步方法将用于的应用程序服务于一些拥有接近 1000 个并发用户的网站。根据您的回答,我认为在这种情况下,尽可能减少由于 I/O 引起的阻塞是有意义的。感谢您的澄清!
    • 1000 个并发用户!= 1000 个并发请求。您的应用程序将在 1000 个并发请求下崩溃。您无法通过异步添加更多容量。肯定不是数据库。例如,SQL Server 同步执行查询。没问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多