我正在尝试打开与SQL Server异步的连接,以免绑定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页面当然意味着我应该只能调用OpenAsync()
方法,而返回的Task
将异步运行异步,而不是同步进行操作,然后将调用线程绑定到Task
完成。
事实证明,这是单声道运行时的错误,并且该代码在Microsoft .NET上正常工作。MySQL .NET库(MySql.Data
)似乎也存在类似的错误,该库同步运行任务,无论是否使用Mono还是Microsoft .NET运行时。
编辑:我找到了MySQL的错误报告。
尝试将Asynchronous Processing=True
或Async=True
属性添加到连接字符串,
并添加等待函数调用,因此:await connection.OpenAsync();
我希望这对您有帮助。