首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >事件/委托订阅是如何同步/阻塞的?

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

Stack Overflow用户
提问于 2012-07-17 10:26:28
回答 2查看 730关注 0票数 1

这段代码在处理过程中将如何表现?(也就是说,它有多同步?)

代码语言:javascript
复制
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都需要很长时间才能完成,那么对每一个块的调用是否会阻塞链(即对下一个的调用)直到它完成为止?如果这是真的,如何使事件调用进程X、Y、Z以并行的方式进行,然后等待它们全部完成,而不是一个接一个地调用它们,然后依次等待每个进程完成?

一些确认书:

  1. 如果订户数量很高,我想StopWatch打印的时间会更长。
  2. 如果Process_N中的处理逻辑变得更重,也会影响StopWatch打印的时间。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-07-17 12:00:19

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

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

代码语言:javascript
复制
public event FooDelegate FooEvent
{
    add
    {
        // code to add an event handler
    }
    remove
    {
        // code to remove an event handler
    }
} 

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

以及乔恩·斯基特在代表和活动上的网页。

票数 1
EN

Stack Overflow用户

发布于 2012-07-17 10:39:09

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

但是:您应该以一种方式实现您的事件处理程序,以便它们不会花很长时间运行!如果他们不得不做繁重的工作,请考虑在您的事件处理程序中开始的任务中运行计算。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11520587

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档