C#SQL连接OpenAsync不是异步的
我正在尝试异步打开与SQL server的连接,以便不占用UI线程。但是我发现对C#SQL连接OpenAsync不是异步的,c#,multithreading,asynchronous,sqlconnection,C#,Multithreading,Asynchronous,Sqlconnection,我正在尝试异步打开与SQL server的连接,以便不占用UI线程。但是我发现对connection.OpenAsync()的调用在连接打开之前不会返回,这与connection.Open()完全相同 该代码再现了该问题: public static void Main(string[] args) { System.Data.SqlClient.SqlConnectionStringBuilder builder = new System.Data.SqlClient.SqlConne
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
不存在。消息即将连接
立即出现,但在等待连接超时时什么也没有发生,然后在连接超时后,消息启动
和完成
同时出现。我希望消息开始
将在消息即将连接
之后立即出现,然后消息完成
将在连接超时后出现
我猜我对返回的
任务
做了一些错事,但是上的Microsoft页面肯定暗示我应该能够调用OpenAsync()
方法,并且返回的任务
将异步运行,而不是同步执行操作并在任务完成之前绑定调用线程。尝试将异步处理=True
或异步=True
属性添加到连接字符串中
并将wait添加到函数调用中,如下所示:wait connection.OpenAsync()代码>
我希望这能对您有所帮助。事实证明,这是Mono运行时中的一个bug,并且该代码在Microsoft.NET上运行良好。MySQL.NET库(MySQL.Data
)似乎也存在类似的错误,它同步运行任务,而不管使用的是Mono还是Microsoft.NET运行时
编辑:我找到了一个解决MySQL问题的方法。我完全尝试了这段代码,它的行为和预期的一样,在“完成”之前我得到了一个“忙”的负载。这是VS2017中的一个新控制台应用程序,目标是.NET 4.6.1。我在MonoDevelop中的目标是.NET 4.5。我在Windows 10和Linux上体验到了相同的行为。我也得到了与Adam相同的结果,它打印了很多次“忙”,然后“完成”。@Michael Ok,我们已经有了不同。对我来说,这似乎是Mono中的一个bug,当它遇到一点可以注册某种等待的地方时,它不会产生任务async
不是并发的,它将同步运行,直到使用IO完成端口等注册后返回控制。@AndyJ不是语法错误,ADO.NET连接派生自DbConnection
。设置builder.AsynchronousProcessing=true
没有帮助wait
使当前线程等待任务完成;我希望在不使用wait
的情况下,我可以获得预期的行为,即当前线程在不等待任务完成的情况下继续运行。此设置在.NET 4.5及更高版本中是不可操作的(根据注释,正在使用)。即使不是,它也只允许使用.BeginXXX
方法(即“旧”异步模型),否则会引发异常,并且对异步/等待的使用没有影响等待等待不会使当前线程等待任务完成,它会使当前线程关闭并执行其他操作(除非任务已经完成)。该错误看起来不太可能被修复,mate,它已经存在了一段时间:-(另一个问题是:@AdamHouldsworth是的,它看起来不会很快被修复。但没关系,我想我已经找到了一个解决我特殊情况的方法。