我正在尝试异步打开与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
做错了,但Task-based Asynchronous Pattern上的Microsoft页面肯定意味着我应该只能调用OpenAsync()
方法并且返回的Task
将异步运行,而不是同步进行的操作并占用调用线程,直到Task
完成。
答案 0 :(得分:3)
事实证明,这是Mono运行时中的一个错误,并且代码在Microsoft .NET上运行良好。 MySQL .NET库(MySql.Data
)似乎也存在类似的错误,无论是否使用Mono或Microsoft .NET运行时,它都会同步运行任务。
答案 1 :(得分:0)
尝试将Asynchronous Processing=True
或Async=True
属性添加到您的连接字符串
并添加等待函数调用,如下所示:await connection.OpenAsync();
我希望这对你有所帮助。