最佳答案
我有一个多层的。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;
行。
知道我哪里做错了吗?
有什么建议我需要调查哪些地方来解决这个问题吗?
这会不会是某个地方的僵局,如果是这样,有没有直接的办法找到它?