gpt4 book ai didi

c# - Open 和 OpenAsync 之间的区别 (SqlConnection)

转载 作者:行者123 更新时间:2023-12-05 08:12:58 24 4
gpt4 key购买 nike

(标题看起来与 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)
}

此代码块采用100 个并发调用平均 13 秒。我尝试将线程池数量增加到 200,以减少 tasks 等待线程的机会。即使在让默认线程池计数后,观察结果也不会改变。

有趣的是,如果我将 await connection.OpenAsync() 更改为 connection.Open(),性能会提高 10 倍。平均 100 个并发调用 1.01 秒

我尝试使用连接池设置,看起来即使我将它减少到任意低的数字(测试时使用的是 2),数字也没有太大变化。

驱动代码为:

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

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

最佳答案

我使用 OpenAsync 的一种方式是打开与多个数据库的连接。

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

如果与远程服务器的连接速度较慢,打开可能需要几秒钟。这样两个公开赛并行进行。

关于c# - Open 和 OpenAsync 之间的区别 (SqlConnection),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41605572/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com