使用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
答案 0 :(得分:4)
此:
var result = cmd.ExecuteReaderAsync().Result;
导致您的代码死锁。我假设您正在运行一个传递同步上下文(UI,ASP.NET,Universal App等)的应用程序。这就是你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 forever和deadlock even after using ConfigureAwait(false) in Asp.Net flow了解更多信息。