确保C#中的多播委托执行列表顺序?

Roy*_*mir 5 .net c# events invocation

在做了一些阅读后,我理解处理程序调用顺序与订阅顺序相同但不保证.

所以我要说:

public event MYDEl ev;
Run Code Online (Sandbox Code Playgroud)

和订阅者:

ev+=GetPaper;
ev+=Print;
ev+=EjectPaper;
Run Code Online (Sandbox Code Playgroud)

保留+确保执行列表顺序的最佳实践机制是什么?

Jon*_*eet 9

如果它是一个场式的事件,它会用简单的委托组合按Delegate.Combine,而且保证维护订阅订单.从文档中返回值:

具有调用列表的新委托,该调度列表以该顺序连接a和b的调用列表.

通常情况下,没有任何保证 - 这取决于实施.哎呀,它可以忽略你做过的每一个订阅.但实际上,任何理智的实现都会保留排序.

编辑:恶作剧事件实施的样本:

public class BadEventPublisher
{
    public event EventHandler Evil
    {
        add { Console.WriteLine("Mwahahaha!"); }
        remove { }
    }

    protected virtual void OnEvil(EventArgs e)
    {
        Console.WriteLine("Who cares? Subscriptions are ignored!");
    }
}
Run Code Online (Sandbox Code Playgroud)

这就像写一个属性(比方说)从getter返回一个随机数并忽略setter中的值.这更像是一个理论问题,而不是一个真实问题.