1

这段代码在处理时间内将如何表现?(即,它有多同步?)

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 的调用是否会阻塞链(即对下一个的调用)直到它完成?如果这是真的,如何使事件以并行方式调用 Processes X、Y、Z 然后等待它们全部完成,而不是一个一个地调用它们并依次等待每个完成?

一些确认:

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

2 回答 2

1

1:是 2:是 它必须事件可能返回结果。

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

于 2012-07-17T10:39:09.257 回答
1

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

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

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

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

和 Jon Skeet 关于代表和活动的页面。

于 2012-07-17T12:00:19.127 回答