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

ste*_*ook 9 .net c# events

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

Tig*_*ran 6

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

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


Ale*_*gos 6

正如 Tigran 所说,事件调用是串行的。更重要的是,如果其中一个订阅者在某个时候抛出异常,则其他订阅者将不会被触发。

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

    public event Action Event;

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

如果出现异常,此实现将遇到相同的问题。