2009-08-07 5 views
15

일부 작업을 위임하는 스레드가 있습니다. 단일 작업이 완료되면 작업이 완료되었다는 이벤트가 발생합니다. 이러한 작업은 특정 순서로 실행되어야하며 이전 작업이 끝날 때까지 기다려야합니다. 스레드가 "작업 완료"이벤트를 수신 할 때까지 스레드를 대기 상태로 만들 수 있습니까? (플래그를 설정하고 플래그를 폴링하는 whilehandler를 제외하고)스레드가 이벤트를 기다렸다가 실행을 계속하는 데 사용할 수있는 메서드는 무엇입니까?

답변

27

나는 종종 AutoResetEvent 대기 핸들을 사용합니다.

먼저 처리해야하는 스레드는 resetEvent를 사용하고 이벤트가 끝날 때까지 기다립니다.

대기해야하는 스레드는 핸들을 보유 할 수 있으며 resetEvent.WaitOne()을 호출합니다. 첫 번째 완료 될 때까지 스레드가 차단됩니다.

이렇게하면 이벤트의 차단 및 정렬을 매우 명확하게 처리 할 수 ​​있습니다.

+1

첫 번째 대답을 바탕으로, 나는 이와 비슷한 것을하고 있습니다. EventResetMode.AutoReset으로 초기화 된 AutoResetEvent와 EventWaitHandle의 차이점은 무엇입니까? – MGSoto

+0

@MGSoto : 그 차이는 최소한이라 생각합니다 :'AutoResetEvent'는'EventWaitHandle'을 상속 받았고 기본 클래스의 생성자를 사용하여'EventResetMode.AutoReset'을 전달한 것으로 보입니다. –

+2

AutoResetEvent, WaitHandles 등은 IDisposable을 구현한다는 것을 잊지 마십시오. –

5

하나의 옵션은 신호 완료에 EventWaitHandle을 사용하는 것입니다.

public void PerformAsyncTasks() 
{ 
    SomeClass someObj = new SomeClass() 
    AutoResetEvent waitHandle = new AutoResetEvent(false); 
    // create and attach event handler for the "Completed" event 
    EventHandler eventHandler = delegate(object sender, EventArgs e) 
    { 
     waitHandle.Set(); // signal that the finished event was raised 
    } 
    someObj.TaskCompleted += eventHandler; 

    // call the async method 
    someObj.PerformFirstTaskAsync();  
    // Wait until the event handler is invoked 
    waitHandle.WaitOne(); 
    // the completed event has been raised, go on with the next one 
    someObj.PerformSecondTaskAsync(); 
    waitHandle.WaitOne(); 
    // ...and so on 
} 
+0

자세히 설명해 주시겠습니까? 이것을 더 잘 설명하면 가장 확실하게 투표 할 것입니다! – Firoso

+1

+1. @firoso, msdn 기사에 자세한 내용이 있습니다. –

+0

여러 언어로 된 예제를 포함하여 – bdonlan

1

당신은 이것에 대한 ManualResetEvent를 사용할 수 있습니다 내가 비동기 작업이 완료 될 때까지 기다릴 필요가있을 때

0

작업자 스레드가 완료 될 때 호출하는 콜백 메서드를 사용하여 좋은 결과를 얻었습니다. 폴링을 능가하며 매개 변수를 호출자에게 쉽게 전달할 수 있습니다.

관련 문제