나는 새로운 'C #을 사용하는 방법을 요구하는 다중 계층 닷넷 4.5 응용 프로그램이 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 문이 완료되고 람다 함수가 완료되지만 return result;
라인에 GetTotalAsync
도달하지 않습니다.
내가 뭘 잘못하고 있는지 아십니까?
이 문제를 해결하기 위해 조사해야 할 위치에 대한 제안이 있습니까?
어딘가에 교착 상태가 될 수 있습니까? 그렇다면 직접 찾을 수있는 방법이 있습니까?
SynchronizationContext
.