我有一个多层的.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;
行永远不会到达。你有什么想法我做错了什么吗?
你有什么建议我需要调查以修复这个问题吗?
这可能是死锁,如果是,是否有任何直接的方法来找到它?
async
/await
关键字的 TPL,也没有出现这个问题。 - Keith