2009-10-06 6 views
3

비동기 이벤트가 완료 될 때까지 어떻게 차단할 수 있습니까?이벤트가 완료 될 때까지 블로킹

private object DoAsynchronousCallSynchronously() 
{ 
    int completed = 0; 
    AsynchronousObject obj = new AsynchronousObject(); 
    obj.OnCompletedCallback += delegate { Interlocked.Increment(ref completed); }; 
    obj.StartWork(); 

    // Busy loop 
    while (completed == 0) 
     Thread.Sleep(50); 

    // StartWork() has completed at this point. 
    return obj.Result; 
} 

폴링하지 않고 할 수있는 방법이 있나요 : 여기

는 이벤트 핸들러와 폴링에 플래그를 플래그를 설정하여 호출되는 이벤트까지 차단하는 방법은 무엇입니까?

답변

5
private object DoAsynchronousCallSynchronously() 
    { 
     AutoResetEvent are = new AutoResetEvent(false); 
     AsynchronousObject obj = new AsynchronousObject();  
     obj.OnCompletedCallback += delegate 
     { 
      are.Set(); 
     };  
     obj.StartWork();  

     are.WaitOne(); 
     // StartWork() has completed at this point.  
     return obj.Result; 
    } 
3

비동기 작업을 사용하지 마십시오. 비동기 작업의이면은 호출 스레드를 차단하지 않는 것입니다.

작업이 완료 될 때까지 호출 스레드를 차단하려면 동기 작업을 사용하십시오.

+0

정답입니다. +1 – spender

+2

API/객체가 동기식 호출을 노출하지 않는 한 (실제로 지금은 작동하지 않습니다). – ctacke

+0

가장 간단한 용어로는 정확할 수도 있지만 비동기 작업 X 횟수만큼을 수행하고 모든 X 작업이 완료 될 때까지 호출자를 차단하려면 어떻게해야할까요? 그것이 OP가 묻는 것을 시도한다면 나는 아마도 그 질문을 바꿔 말할 것입니다.하지만 제가 그 질문을 읽을 때 그것은 저에게 뛰어 오는 첫 번째 것입니다. – Joseph

관련 문제