Open和OpenAsync之间的区别(SqlConnection)

时间:2017-01-12 05:14:38

标签: c# sql ado.net async-await

(标题看起来类似于SqlConnection.Open vs SqlConnection.OpenAsync - what's different between the two beyond the obvious?但是a。它没有任何答案,b。我案例中的观察结果不同)

虽然在asp.net服务中追逐性能问题的基准测试,但我偶然发现了一个奇怪的观察,其中SqlConnection.Open的表现远远优于SqlConnection.OpenAsync(详情如下)。

从源代码here看来,Open的代码只是OpenAsync的一个子集。差异here

我很高兴给定OpenOpenAsync完全相同,使用异步版本(如果有的话)有什么好处?

详细信息:

这是我创建连接的方式

using (SqlConnection connection = new SqlConnection(connectionString))
{
    await connection.OpenAsync();
    // run actual operation on connection (in an async way)
}

此代码块需要 13 seconds on an average for 100 concurrent calls。我已经尝试将线程池数增加到200,以减少tasks等待线程的机会。即使在让默认线程池计数之后,观察也不会改变。

有趣的是,如果我用await connection.OpenAsync()更改connection.Open(),性能会提高10倍。 1.01 seconds on an average of 100 concurrent calls

我尝试使用connection pool settings,看起来即使我将其减少到一个任意低的数字(2是经过测试的),数字也没有太大变化。

驱动程序代码为:

Task.WhenAll(Enumerable.Range(0, maxConcurrentCalls).Select((idx) => CallQuery(idx))).Result;

我等待的原因(通过执行.Result是因为驱动程序代码是一个控制台应用程序,必须具有同步main)。在实际的生产代码中,包括控制器在内的所有内容都是async

1 个答案:

答案 0 :(得分:-3)

使用OpenAsync的一种方法是,如果我具有到多个数据库的开放连接。

Task t = conn1.OpenAsync();
conn2.Open();
t.Wait();

如果与远程服务器的连接速度较慢,则打开可能需要花费几秒钟的时间。这样,两个公开赛同时发生。