c#事件是串行还是并行处理的?

时间:2014-06-17 06:27:10

标签: c# .net events

例如,我有一个触发事件的类,以及该事件的1000个订阅者。用于逐个触发每个订阅者委托的单个线程吗?或.Net使用线程池并行处理部分或全部订阅?

2 个答案:

答案 0 :(得分:3)

原样,事件是简单的串行调用。如果你想要可以以异步方式运行它,但这是一个实现细节。

简而言之:标准.NET事件没有任何内置的并行化或异步,您需要实现它。

答案 1 :(得分:2)

正如Tigran所说,事件调用是串行的。如果其中一个订阅者在某个时刻抛出异常,其余的将不会被触发,甚至更多。

并行触发事件的最简单方法是

    public event Action Event;

    public void Trigger()
    {
        if (Event != null)
        {
            var delegates = Event.GetInvocationList();
            Parallel.ForEach(delegates, d => d.DynamicInvoke());
        }
    }

如果发生异常,此实现将遇到同样的问题。