(标题看起来类似于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
我很高兴给定Open
与OpenAsync
完全相同,使用异步版本(如果有的话)有什么好处?
详细信息:
这是我创建连接的方式
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
。
答案 0 :(得分:-3)
使用OpenAsync的一种方法是,如果我具有到多个数据库的开放连接。
Task t = conn1.OpenAsync();
conn2.Open();
t.Wait();
如果与远程服务器的连接速度较慢,则打开可能需要花费几秒钟的时间。这样,两个公开赛同时发生。