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