首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C# SQL connection OpenAsync不是异步的。

问C# SQL connection OpenAsync不是异步的。
EN

Stack Overflow用户
提问于 2017-11-23 21:27:40
回答 2查看 2.3K关注 0票数 3

我正在尝试异步打开到SQL服务器的连接,以免占用UI线程。但我发现,与connection.Open()完全一样,在打开连接之前,对connection.OpenAsync()的调用不会返回。

此代码会重现此问题:

代码语言:javascript
复制
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做错了什么,但是Task-based Asynchronous Pattern上的微软页面肯定意味着我应该能够简单地调用OpenAsync()方法,并且返回的Task将异步运行,而不是同步发生操作并在Task完成之前占用调用线程。

EN

回答 2

Stack Overflow用户

发布于 2017-11-23 23:28:34

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

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

票数 3
EN

Stack Overflow用户

发布于 2017-11-23 22:10:43

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

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

我希望这对你有帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47456689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档