C# SQL连接OpenAsync不是异步的

标签 c# multithreading asynchronous sqlconnection

我正在尝试异步打开到 SQL 服务器的连接,以免占用 UI 线程。但我发现对 connection.OpenAsync() 的调用在连接打开之前不会返回,这与 connection.Open() 完全一样。

这段代码重现了这个问题:

public static void Main(string[] args)
{
    System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConnectionStringBuilder();
    builder.UserID = "sa";
    builder.Password = "1234";
    builder.DataSource = "192.168.1.254\\SQLEXPRESS";
    builder.InitialCatalog = "MyDatabase";
    builder.PersistSecurityInfo = true;

    DbConnection connection = new System.Data.SqlClient.SqlConnection(builder.ConnectionString);

    Console.WriteLine("about to connect");

    Task connection_task = connection.OpenAsync();

    Console.WriteLine("started");

    while (!connection_task.IsCompleted && !connection_task.IsFaulted && !connection_task.IsCanceled)
    {
        Console.WriteLine("busy");
    }

    Console.WriteLine("done");
}

在这种情况下,192.168.1.254 不存在。消息 about to connect 立即出现,但在等待连接超时时没有任何反应,然后在连接超时后消息 starteddone 同时出现。我希望消息 started 会在消息 about to connect 之后立即出现,然后消息 done 会在连接计时后出现出。

我猜我对返回的 Task 做错了什么,但是 Microsoft 页面在 Task-based Asynchronous Pattern 上当然意味着我应该能够简单地调用 OpenAsync() 方法并且返回的 Task 将异步运行,而不是同步发生并占用调用的操作线程直到 Task 完成。

最佳答案

事实证明,这是 Mono 运行时中的错误,代码在 Microsoft .NET 上运行良好。 MySQL .NET 库 (MySql.Data) 似乎也存在类似的错误,无论使用 Mono 还是 Microsoft .NET 运行时,它都会同步运行任务。

编辑:我找到了一个 bug report MySQL 的问题。

关于C# SQL连接OpenAsync不是异步的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47456689/

相关文章:

c# - AutoMapper 3 中的映射行为不一致

java - 错误: JPA + MySQL Transaction is not active in the current thread

multithreading - 为什么没有 Qt 连接模式在 Qt::DirectConnection 和 Qt::BlockingQueuedConnection 之间自动选择?

c# - 在 Web API Controller 中调用多个异步任务的最佳方式是什么?

c# - 如何在表单关闭时停止异步方法

c# - 如何扩展 WPF 路径控件

c# - 尝试将值写入 C# 中 Excel 工作表中的单元格时出错

c# - Cassandra get_range_slice

java - 一个线程中的 Thread.sleep() 使 UI 线程也进入休眠状态

c++ - boost/asio async_read() TCP 服务器 - 了解 io_service.run() 在 linux 上