Какие методы можно использовать, чтобы заставить поток ожидать событие и затем продолжать его выполнение? - PullRequest
16 голосов
/ 07 августа 2009

У меня запущен поток, который делегирует некоторые задачи. Когда одна задача завершена, возникает событие, сообщающее, что оно выполнено. Эти задачи должны выполняться в определенном порядке и должны ждать завершения предыдущей задачи. Как я могу заставить поток ждать, пока он не получит событие "задача выполнена"? (Помимо очевидного обработчика событий, который устанавливает флаг, а затем цикл while опрашивает флаг)

Ответы [ 4 ]

27 голосов
/ 07 августа 2009

Я часто использую дескриптор ожидания AutoResetEvent, когда мне нужно дождаться завершения асинхронной задачи:

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
}
5 голосов
/ 07 августа 2009

Один из вариантов - использовать EventWaitHandle для оповещения о завершении.

1 голос
/ 07 августа 2009

Для этого вы можете использовать ManualResetEvent .

Поток, который должен обработать сначала, просто берет resetEvent и ждет до конца, чтобы установить событие.

Поток, который должен ждать, может содержать дескриптор и вызывать resetEvent.WaitOne (). Это будет блокировать этот поток, пока не завершится первый.

Это позволяет очень аккуратно обрабатывать блокировку и упорядочение событий.

0 голосов
/ 07 августа 2009

Я получил хорошие результаты, используя метод обратного вызова, который рабочий поток вызывает по завершении. Он опережает опрос и позволяет легко передавать параметры вызывающей стороне.

...