我正在尝试异步打开到SQL服务器的连接,以免占用UI线程。但我发现,与connection.Open()完全一样,在打开连接之前,对connection.OpenAsync()的调用不会返回。
此代码会重现此问题:
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做错了什么,但是Task-based Asynchronous Pattern上的微软页面肯定意味着我应该能够简单地调用OpenAsync()方法,并且返回的Task将异步运行,而不是同步发生操作并在Task完成之前占用调用线程。
发布于 2017-11-23 23:28:34
事实证明,这是Mono运行时中的一个错误,代码在微软.NET上运行良好。MySQL .NET库(MySql.Data)似乎也存在类似的错误,无论使用Mono还是微软.NET运行时,它都会同步运行任务。
编辑:我找到了解决MySQL问题的bug report。
发布于 2017-11-23 22:10:43
尝试将Asynchronous Processing=True或Async=True属性添加到连接字符串中,
并将等待添加到函数调用中,如下所示:await connection.OpenAsync();
我希望这对你有帮助。
https://stackoverflow.com/questions/47456689
复制相似问题