2014-02-10 4 views
0

어떻게하면 async/await 메서드가 실행되고 어떤 스레드에서 약간 흐릿한 지 알았습니다. 나는 사건이 해고 될 때까지 방법을 막고 싶다. 이렇게하려면 ManualResetEvent을 사용해 보았지만 마지막 waitHandle.Set()이 호출 될 때까지 모든 async 메서드가 완료 될 때까지 비동기 메서드에 대한 모든 호출을 차단합니다.수동으로 비동기 메서드 차단하기

기반의 이벤트 기반 비동기 접근 방식을 async/await 기반으로 변환하려고 시도 할 때 async 호출을 개별적으로 차단하는 방법이 필요합니다.

어떻게 할 수 있습니까?

업데이트 :이 확신

public async Task<IEnumerable<CustomerNoteInfo>> LoadClientNotesAsync(int id) 
    { 
     return await _session.InvokeOperationAsync((client) => 
     { 
      var tcs = new TaskCompletionSource<IEnumerable<CustomerNoteInfo>>(); 
      client.GetCustomerNotesCompleted += (sender, e) => 
      { 
       if (e.Error != null) tcs.TrySetException(e.Error); 
       else tcs.TrySetResult(e.Result); 
      }; 

      client.GetCustomerNotesAsync(id); 
      return tcs.Task; 
     }).Unwrap(); 
    } 

: 스티븐과 Noseratio에서 제공하는 정보를 바탕으로

, 내가 지금이 라인 긴 뭔가 내 비동기 방식을 변경 모든 비동기/작업 기반 프로그래밍을 기다리고있는 모든 사람들에게보기 흉한 것처럼 보일 것입니다. 그러나 이것에 대해 올바른 방향으로 가고 있습니까? 수동 리셋 이벤트로 인해 발생했던 문제가 해결 된 것 같습니다. 이제이 메서드를 여러 번 비동기 적으로 실행할 수 있습니다. :)

+0

휴대용 클래스 라이브러리의 서비스 참조 추가로 생성 된 비동기 메소드 이벤트 쌍과 함께'Task.Factory.FromAsync'를 어떻게 사용합니까? 이 메서드는'IAsyncResult' 등을 반환하지 않으므로. – rtlayzell

+1

이벤트가 있다면 'TaskCompletionSource'를 사용하십시오. [방법 : 작업에서 EAP 패턴 줄이기] (http://msdn.microsoft.com/en-us/library/ee622454(v=vs.110) .aspx) – Noseratio

답변

3

비동기/대기 메서드가 실행되는 방식과 스레드가 약간 흐릿한 것에 대한 지식이 있습니다.

나는 async intro으로 시작하는 것이 좋습니다. 여기에는 키워드와이 키워드가 사용하는 스레드를 결정하는 방법이 나와 있습니다.

비동기 방식의 이벤트 기반 비동기식 작업을 비동기식/대기중인 작업으로 변환하려고합니다.

MSDN documentation on this은 아주 좋습니다.

async 메서드를 차단할 필요가 없습니다. EAP (메소드/이벤트 쌍)에 대한 TAP (태스크 기반) 랩퍼 만 작성하면됩니다. 그런 다음 TAP 메서드를 호출하고 await 반환 된 작업을 호출 할 수 있습니다.