C#SQL连接OpenAsync不是异步的

时间:2017-11-23 13:27:40

标签: c# multithreading asynchronous sqlconnection

我正在尝试异步打开与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会立即显示,但在等待连接超时时没有任何反应,然后在连接超时后,消息starteddone同时出现。我希望消息started会在消息about to connect之后立即显示,然后一旦连接超时,消息done就会出现。

我猜测我对返回的Task做错了,但Task-based Asynchronous Pattern上的Microsoft页面肯定意味着我应该只能调用OpenAsync()方法并且返回的Task将异步运行,而不是同步进行的操作并占用调用线程,直到Task完成。

2 个答案:

答案 0 :(得分:3)

事实证明,这是Mono运行时中的一个错误,并且代码在Microsoft .NET上运行良好。 MySQL .NET库(MySql.Data)似乎也存在类似的错误,无论是否使用Mono或Microsoft .NET运行时,它都会同步运行任务。

编辑:我找到了bug report来解决MySQL问题。

答案 1 :(得分:0)

尝试将Asynchronous Processing=TrueAsync=True属性添加到您的连接字符串

并添加等待函数调用,如下所示:await connection.OpenAsync();

我希望这对你有所帮助。