C# 如果我需要按特定顺序执行事件处理程序呢?

C# 如果我需要按特定顺序执行事件处理程序呢?,c#,C#,我有一个事件,例如: public event EventHandler<NewReadyMessageEventArgs> NewReadyMessage 公共事件事件处理程序NewReadyMessage 问题是,我需要向它附加两个处理程序,并且需要先执行一个处理程序,然后再执行另一个处理程序(因为最后一个处理程序依赖于第一个处理程序)。也就是说,我需要特定的执行顺序 我知道在现实中,处理程序将一个接一个地执行,所以我只需要按正确的顺序附加它们,但这将是一个非常错误的设计 我

我有一个事件,例如:

public event EventHandler<NewReadyMessageEventArgs> NewReadyMessage
公共事件事件处理程序NewReadyMessage
问题是,我需要向它附加两个处理程序,并且需要先执行一个处理程序,然后再执行另一个处理程序(因为最后一个处理程序依赖于第一个处理程序)。也就是说,我需要特定的执行顺序

我知道在现实中,处理程序将一个接一个地执行,所以我只需要按正确的顺序附加它们,但这将是一个非常错误的设计


我想创建单独的处理程序并附加它。在这个处理程序中,我只想按正确的顺序执行我的两个处理程序。您认为如何?您有什么建议?

如果您不希望默认的多播委托包含默认事件
添加
删除
实现,我建议您实现自己的
添加
实现

有关更多信息,请参阅

如果不明显,如果不使用默认的多播委托,则需要手动实现订阅服务器的调用。上面的链接详细介绍了如何编写自定义添加/删除以使用多播委托。此答案假设您不使用多播委托,例如:

   private List<EventHandler> eventList = new List<EventHandler>();

   public event EventHandler Event1 
   {
      add { eventList.Add(value); }
      remove { eventList.Remove(value); }
   }

    private void RaiseEvent1()
    {
        foreach(var e in eventList)
        {
            e(this, EventArgs.Empty);
        }
    }
private List eventList=new List();
公共事件处理程序Event1
{
添加{eventList.add(value);}
删除{eventList.remove(value);}
}
私有void RaiseEvent1()
{
foreach(事件列表中的变量e)
{
e(此,EventArgs.Empty);
}
}
如果需要特定订单,请使用
SortedList

问题是,我需要向它附加两个处理程序,并且我需要在另一个处理程序之前执行一个处理程序(因为最后一个处理程序依赖于第一个处理程序)

在这种情况下,我会重新考虑你的设计。“第一个”处理程序引发自己的事件可能更有意义


第二个处理程序可以附加到该事件,并具有两个项目的结果。

我不会依赖内部实现来确保以特定顺序调用处理程序


如果处理程序不能相互了解,但您需要它们以特定的顺序运行,我将创建一个“父”处理程序,以正确的顺序调用其他两个处理程序。

听起来这可能是一个您只需要有多(2)个事件的地方


如果顺序很重要,则有两个事件,其中一个事件只是在另一个事件之后触发。例如,您可以在ASP中的页面生命周期中看到这一点。有很多事件,在某些情况下,它们都是一个接一个地被触发的,它们之间有一个真正的东西,而不是保证前一个事件的所有处理程序都运行。这听起来和你的情况一样。

也许你应该只附加一个处理程序,这个处理程序自己调用第二个处理程序?可能的重复:如果你不能让处理程序链接他们的调用,你真的无能为力。在.NET中,无法控制哪些处理程序在何时、以何种顺序执行……如果顺序很重要,对我来说,这听起来像是一个设计缺陷。您可以尝试设置某种类型的事件“队列”或类似的东西。@UweKeim:order不应该是相关的,真的-否则,我认为这是一种设计味道。这没有任何帮助,您正在更改添加/删除,而不是执行。@CodingGorilla很好,详细说明不使用“默认多播”这意味着他不会使用多播委托调用事件订阅,也不会使用某种自定义算法(他确实没有详细说明)。所以,是的,它确实有帮助。如果下雨,打开伞回家。你建议我每次打开雨伞都回家吗?@javapowered如果你想保证在雨伞打开之前你不会回家,我建议你“在雨伞因为下雨而打开的任何时候都回家”——即:雨伞。opened可以说它是因为下雨而打开的。我不想把“回家”附加到“伞。opened”。似乎只创建一个处理程序是有意义的,它知道按照什么顺序做什么…@javapowered在你的例子中,虽然-我会在“你”上使用一个处理程序-因为你可以“打开伞回家”-不需要两个订阅者。现在想象一下,我需要打开伞,开始吸烟,打电话给我的朋友,然后按顺序回家:)