(标题看起来类似于SqlConnection.Open对SqlConnection.OpenAsync --这两者之间有什么不同?,但a.它没有任何答案,b.在我的例子中的观察结果是不同的)
虽然为了在asp.net服务中解决性能问题而进行了工作台标记,但我意外地碰到了一个奇怪的观察,其中SqlConnection.Open
的性能要比SqlConnection.OpenAsync
好得多(下面是更多的细节)。
从源代码来看,这里看起来像Open
的代码只是OpenAsync
的一个子集。差分这里
我很好奇,如果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
。
发布于 2020-09-26 15:44:03
我使用OpenAsync的一种方法是,如果我有到多个数据库的开放连接。
Task t = conn1.OpenAsync();
conn2.Open();
t.Wait();
如果连接到远程服务器的速度较慢,则Open可能需要几秒钟时间。这样,两场公开赛是平行进行的。
https://stackoverflow.com/questions/41605572
复制相似问题