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

标签 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

我很好奇给定的 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/

相关文章:

c# - 在类型转换中执行 C# 空检查的简便方法

sql-server - Entity Framework 外键映射到同一个表

ado.net - "Cannot find libSQLDBCHDB.dll"使用 .NET 连接到 SAP HANA 时

c# - asp.net Ado 存储过程字段

c# - 如何将包含不同数据类型列表的列表作为子列表?

c# - 如何生成/计算十二面体的顶点?

mysql - 计算一个表中另一表中最大日期之前和之后发生的记录

java - 在SQL语句中,如何选择所有不符合特定条件的元素?

php - 为下面的查询创建索引的最佳方法是什么

c# - 每行设置 XAML Datagrid 文本颜色