同步/阻塞是如何进行事件/委托订阅的?

时间:2012-07-17 10:26:28

标签: c# .net multithreading

这段代码如何通过处理时间来表现? (即它是如何同步的?)

public delegate void FooDelegate(bytes[] data);
public event FooDelegate FooEvent;

FooEvent += new FooDelegate(Process_X);
FooEvent += new FooDelegate(Process_Y);
FooEvent += new FooDelegate(Process_Z);

while (receiving)
{     
   byte[] data = getRealTimeData();

   StopWatch.Start();

   FooEvent(data);

   StopWatch.Stop();

   Console.Write(StopWatch.Elapsed.Millisec));
   StopWatch.Reset();
}

我有几个问题:

  1. 对FooEvent的调用会导致顺序/同步调用每个订阅过程吗? (可能是的......)
  2. 假设每个Process_N需要很长时间才能完成,那么对每个Process_N的调用是否会阻塞链(即调用下一个链)直到它完成?如果这是真的,如何使事件调用以并行方式处理X,Y,Z然后等待所有它们完成,而不是逐个调用它们并顺序等待每一个完成?
  3. 一些确认:

    1. 如果订阅者数量非常多,我猜StopWatch打印的时间会更高
    2. 如果Process_N中的处理逻辑变重,它也会影响StopWatch打印的时间

2 个答案:

答案 0 :(得分:1)

1:是的 2:是的 事件可能会返回结果。

但是:你应该以某种方式实现你的事件处理程序,这样它们就不会花费很长时间来运行! 如果他们必须进行繁重的工作,请考虑在您的事件处理器中启动的任务中运行计算。

答案 1 :(得分:1)

看起来您会受益于事件处理程序的并行化,因为它们确实会按顺序和同步执行。

要创建自定义事件处理程序,您可以编写:

public event FooDelegate FooEvent
{
    add
    {
        // code to add an event handler
    }
    remove
    {
        // code to remove an event handler
    }
} 

有关如何处理自定义事件处理程序的详细信息,请参阅以下问题:

和Jon Skeet关于delegates and events的页面。

相关问题