如何知道所有事件处理程序何时完成执行?

时间:2017-01-11 06:46:58

标签: c# events

我正在创建一些测试,其中包括检查在某些条件下正在执行与事件关联的方法。要检查处理程序是否已执行,我将添加一个sleep(x ms)以确保处理程序在检查结果之前已完成执行。

有没有办法订阅能够告诉我事件的所有处理程序何时完成执行的内容?

2 个答案:

答案 0 :(得分:1)

按顺序调用事件处理程序。因此,订阅事件本身:在所有已订阅的处理程序之后立即调用您自己的处理程序。

答案 1 :(得分:0)

如果您提前了解处理程序/事件的数量,则可以使用InterlockedManualResetEvent来实现此目的。

在测试开始时,存储处理程序的数量并设置事件:

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();