У меня есть многоуровневое приложение .Net 4.5, вызывающее метод с использованием ключевых слов С# new async
и await
, которые просто зависают, и я не понимаю, почему.
Внизу у меня есть метод async, который расширяет нашу утилиту базы данных 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;
}
Затем у меня есть метод async среднего уровня, который вызывает это, чтобы получить несколько медленных итогов:
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 завершится и функция лямбда заканчивается, но строка return result;
GetTotalAsync
никогда не будет достигнута.
Любая идея, что я делаю неправильно?
Любые предложения, где мне нужно исследовать, чтобы исправить это?
Может ли это быть тупиком где-то, и если да, то есть какой-нибудь прямой способ его найти?