Подождите, пока не будет вызван делегат - PullRequest
3 голосов
/ 14 февраля 2011

У меня есть асинхронный класс с методом StartProcessing(), который вызывает событие int ResultReady() после завершения обработки. StartProcessing() занимает очень мало времени.

Я хочу вызвать этот класс синхронно. Мой псевдокод должен выглядеть примерно так:

  1. Вызов StartProcessing ()

  2. Ждать / спать, пока результат не будет готов

  3. Возвращаемый результат

Какой шаблон дизайна лучше для этого? Не могли бы вы указать мне пример кода?

1 Ответ

5 голосов
/ 14 февраля 2011

Один простой способ сделать это с помощью ManualResetEvent, к которому имеют доступ обработчик события и код ожидания. Вызовите Set из обработчика событий и WaitOne (или перегрузку с таймаутом) из ожидающего потока. Обратите внимание, что это не может быть сделано в потоке STA, поэтому вы не можете сделать это в потоке WinForms (который всегда должен быть STA) - но вы все равно не должны ждать внутри потока пользовательского интерфейса.

Примерно так:

var async = new AsyncClass();
var manualEvent = new ManualResetEvent();
async.ResultReady += args => manualEvent.Set();
async.StartProcessing();
manualEvent.WaitOne();
...