Какие методы можно использовать для того, чтобы поток зависел от события и продолжал его выполнение?

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

Ответы

Ответ 1

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

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
}

Ответ 2

Один из вариантов заключается в использовании EventWaitHandle для завершения сигнала.

Ответ 3

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

В потоке, который необходимо обработать, сначала просто выполняется resetEvent, и ждет, пока не закончится установка события.

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

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

Ответ 4

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