我正在尝试异步打开到 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
立即出现,但在等待连接超时时没有任何反应,然后在连接超时后消息 started
和 done
同时出现。我希望消息 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/