Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#SQL连接OpenAsync不是异步的_C#_Multithreading_Asynchronous_Sqlconnection - Fatal编程技术网

C#SQL连接OpenAsync不是异步的

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

我正在尝试异步打开与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
不存在。消息
即将连接
立即出现,但在等待连接超时时什么也没有发生,然后在连接超时后,消息
启动
完成
同时出现。我希望消息
开始
将在消息
即将连接
之后立即出现,然后消息
完成
将在连接超时后出现


我猜我对返回的
任务
做了一些错事,但是上的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是的,它看起来不会很快被修复。但没关系,我想我已经找到了一个解决我特殊情况的方法。