2014-09-17 4 views
3

일부 비동기 쿼리를 실행하려고합니다. 그러나 코드를 통해 디버깅 할 때 ToListAsync()가 호출 될 때 대부분 프로그램이 중지됩니다. 가시적 인 예외는 없으며 콜 스택 창은 지워집니다. VS에서 pause 버튼을 누르면 현재 메소드가 호출되기 바로 전에 스택 프레임을 볼 수 있습니다.ToListAsync()가 전혀 완료되지 않음

var res1 = await context.Address().Where(...).ToListAsync(); 
var res2 = await context.Person().Where(...).ToListAsync(); 
var res3 = await context.Rule().Where(...).ToListAsync(); 

경우에 따라 첫 번째 호출이 작동하는 경우도 있고, 드물게 두 번째 호출이 작동하는 경우도 있습니다. 적어도 세 번째 호출에서 프로그램이 중지됩니다. 나는 전혀 단서 왜 ... 코멘트에서

+0

당신은 "프로그램이 중지"에 의해 무엇을 의미합니까? 예를 들어 명령 행 프로그램입니까? 그렇다면 호출이 비 차단이기 때문에 종료됩니다. 여기에 더 많은 컨텍스트가 필요합니다. –

+2

호출 스택에서 더 이상 '대기'또는 '결과'를 호출하고 있습니까? –

+0

wpf 응용 프로그램입니다. 명령은 비동기 메서드 내에 있습니다. 나는 이것을'var result = LoadAsync.Result()'를 사용하여 비동기 방식으로 호출한다. _stops_를 사용하면 실행이 영원히 걸리는 것처럼 보입니다. 디버거는 더 이상 진행되지 않습니다. –

답변

11

이 없다 :

그것은 WPF 응용 프로그램입니다. 명령은 비동기 메서드 내에 있습니다. 내가 바로 거기 var result = LoadAsync.Result();

를 사용하여 비 비동기 방식에서 이것을 호출합니다 교착 상태 이잖아. 상단

  1. await 다음 DispatcherSynchronizationContext 다시 현재 LoadAsync.Result

    용액에 대한 호출에 의해 차단 디스패처 (UI) 스레드 상 (제 await 후 모두) 연속 마샬링하려고 제작하여 호출 스택의 당신의 방법 대신 Task.Result를 사용하는 async Task를 반환 :

    await LoadAsync(); 
    
  2. 당신이 만약 앱솔루트 스택의 맨 위에있는 메소드를 async Task으로 변경하고 확실하지 않은 이유로 Task.Result을 호출해야합니다. 내부 비동기 메소드를 awating 할 때는 ConfigureAwait(false)을 사용해야합니다. 이 명시 적으로 배차 실에 다시 작업을 마샬링을 시도하지 않도록 동기 문맥을 말할 것이다 :

    var res1 = await context.Address().Where(...).ToListAsync().ConfigureAwait(false); 
    var res2 = await context.Person().Where(...).ToListAsync().ConfigureAwait(false); 
    var res3 = await context.Rule().Where(...).ToListAsync().ConfigureAwait(false);   
    
+0

이 경우에는 (1) *과 (2)를 수행해야합니다. 또 다른 트릭 (하지만 권장되지 않은 연습)은 최상위 레벨에서'LoadAsync(). Result' 대신'Task.Run (() => LoadAsync()) Result'를 실행하는 것입니다. '. 'await' 중 일부에서'ConfigureAwait (false)'를 잊어 버린 경우 교착 상태가 멈추지 만 일반적으로 영구적 인 해결책은 아닙니다. –

+1

이 설명에 감사드립니다. 나는 지금까지 이것을 몰랐다. 세부 사항이 필요한 사람들을 위해 Stephen Cleary의 블로그 게시물 [비동기 코드 차단 안함] (http://blog.stephencleary.com/2012/07/dont-block-on-async-code.html)을 발견했습니다. . –

관련 문제