2017-01-11 3 views
0

Я создаю несколько тестов, которые включают проверку того, что метод, связанный с событием, выполняется при определенных условиях. Чтобы проверить, что обработчик выполнен, я добавляю sleep (x ms), чтобы убедиться, что обработчик завершил выполнение, прежде чем проверять результат.Как узнать, когда закончились все обработчики событий?

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

ответ

1

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

+0

Очень хороший ответ. Простой и он работает для меня :) –

0

Вы можете достичь этого с помощью Interlocked и ManualResetEvent, если вам известно количество обработчиков/событий загодя.

В начале испытания, сохранить количество обработчиков и настроить событие:

int noOfHandlers = 3; //or however many 
ManualResetEvent handlersFinishedEvent = new ManualResetEvent(false); 

Затем в методе обработчика событий:

public void OnEvent(EventArgs e) 
{ 
    // do event stuff 
    if (Interlocked.Decrement(ref noOfHandlers) == 0)) 
    { 
     // only the last handler will come in here 
     handlersFinishedEvent.Set(); 
    } 
} 

Тогда ваш тест нить просто ждет на ManualResetEvent, который будет запускаться только после завершения всех событий:

handlersFinishedEvent.WaitOne(); 
Смежные вопросы