我有一个多层 .Net 4.5 应用程序使用 C# 的 newasync
和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 函数完成,但永远不会到达该return result;
行。GetTotalAsync
知道我做错了什么吗?
关于我需要在哪里进行调查以解决此问题的任何建议?
这可能是某个地方的僵局,如果是这样,有没有直接的方法可以找到它?