C#SQL Connection OpenAsync不是异步



我正在尝试打开与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立即出现,但是在等待连接到超时的时候,没有发生任何事情,然后在连接之后,消息starteddone同时出现。我希望消息started将立即出现在消息about to connect之后,然后消息done将稍后出现,一旦连接已计时。

我猜我在返回的Task上做错了什么,但是基于任务的异步模式上的Microsoft页面当然意味着我应该只能调用OpenAsync()方法,而返回的Task将异步运行异步,而不是同步进行操作,然后将调用线程绑定到Task完成。

事实证明,这是单声道运行时的错误,并且该代码在Microsoft .NET上正常工作。MySQL .NET库(MySql.Data)似乎也存在类似的错误,该库同步运行任务,无论是否使用Mono还是Microsoft .NET运行时。

编辑:我找到了MySQL的错误报告。

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

并添加等待函数调用,因此:await connection.OpenAsync();

我希望这对您有帮助。

最新更新