【问题标题】:Glimpse ADO "ExecuteReaderAsync()" does not respond瞥见 ADO“ExecuteReaderAsync()”没有响应
【发布时间】:2015-02-17 06:29:09
【问题描述】:

当使用 Glimpse ADO ExecuteReaderAsync() 没有永远返回任何响应时:

var factory = System.Data.Common.DbProviderFactories.GetFactory("System.Data.SqlClient");
var conn = factory.CreateConnection();
conn.ConnectionString = "YourConnectionString";
conn.Open();

var cmd = conn.CreateCommand();
cmd.CommandText = "Select 1";                 // Correct SQL is not required. If use SQL "Foo" brings same result.

var result = cmd.ExecuteReaderAsync().Result; // NG. Responce did not return forever.
// var result = cmd.ExecuteReader();          // OK. Responce is return soon.

我使用 GlimpseAdo,所以factory.CreateConnection() 创建了一个GlimpseDbConnection 的实例。 然后我通过GlimpseDbCommand 执行 SQL 异步并等待查询结果异步。

但是cmd.ExecuteReaderAsync().Result 并没有永远返回任何响应。
等待超过 10 分钟,但不会发生超时。 我在 VisualStudio 上暂停调试,调试语句开启 var result = cmd.ExecuteReaderAsync().Result;.

我认为...这是由异步引起的问题。
您知道响应消失的原因和位置吗?

谢谢你的帮助 !

二手:

.Net Framework 4.5.2
Glimpse.Core 1.8.6
一瞥 ADO 1.7.3
SQL Server 2008 R2

【问题讨论】:

    标签: c# .net ado.net async-await glimpse


    【解决方案1】:

    这个:

    var result = cmd.ExecuteReaderAsync().Result;
    

    导致您的代码死锁。我假设您正在运行一个传递同步上下文(UI、ASP.NET、通用应用程序等)的应用程序。这就是为什么你shouldn't block on async code

    要解决这个问题,您必须将方法设为 async Task 并使用 await 而不是 .Result

    var result = await cmd.ExecuteReaderAsync();
    

    您还可以查看Trying to call Async method synchronously. It waits on Task.Result foreverdeadlock even after using ConfigureAwait(false) in Asp.Net flow 了解更多信息。

    【讨论】:

    • 感谢您的回答!我误解了异步处理。
    • @t2k 你不是第一个 :)
    猜你喜欢
    • 1970-01-01
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多