【发布时间】:2019-10-21 06:56:38
【问题描述】:
我有一个多层 .Net 4.5 应用程序调用一个使用 C# 的新 async 和 await 关键字的方法,它只是挂起,我不明白为什么。
在底部,我有一个扩展我们的数据库实用程序OurDBConn 的异步方法(基本上是底层DBConnection 和DBCommand 对象的包装器):
public static async Task<T> ExecuteAsync<T>(this OurDBConn dataSource, Func<OurDBConn, T> function)
{
string connectionString = dataSource.ConnectionString;
// Start the SQL and pass back to the caller until finished
T result = await Task.Run(
() =>
{
// Copy the SQL connection so that we don't get two commands running at the same time on the same open connection
using (var ds = new OurDBConn(connectionString))
{
return function(ds);
}
});
return result;
}
然后我有一个中级异步方法调用它来获得一些运行缓慢的总计:
public static async Task<ResultClass> GetTotalAsync( ... )
{
var result = await this.DBConnection.ExecuteAsync<ResultClass>(
ds => ds.Execute("select slow running data into result"));
return result;
}
最后我有一个同步运行的 UI 方法(一个 MVC 操作):
Task<ResultClass> asyncTask = midLevelClass.GetTotalAsync(...);
// do other stuff that takes a few seconds
ResultClass slowTotal = asyncTask.Result;
问题是它永远挂在最后一行。如果我打电话给asyncTask.Wait(),它会做同样的事情。如果我直接运行慢 SQL 方法大约需要 4 秒。
我期望的行为是,当它到达asyncTask.Result 时,如果它没有完成,它应该等到它完成,一旦它应该返回结果。
如果我使用调试器单步执行,SQL 语句完成并且 lambda 函数完成,但永远不会到达 GetTotalAsync 的 return result; 行。
知道我做错了什么吗?
对于我需要在哪里进行调查以解决此问题有什么建议吗?
这可能是某个地方的死锁,如果是这样,有没有直接的方法可以找到它?
【问题讨论】:
标签: c# asynchronous async-await task-parallel-library