如果我需要按特定顺序执行事件处理程序怎么办?

时间:2012-08-20 18:49:04

标签: c#

我有事件,例如:

public event EventHandler<NewReadyMessageEventArgs> NewReadyMessage

问题是我需要为它添加两个处理程序,我需要先执行一个(因为最后一个依赖于第一个)。即我需要处理器执行的某些顺序。

据我所知,实际上处理程序将逐个执行,所以我只需要按正确的顺序附加它们,但这将是非常错误的设计。

我想创建单独的处理程序并附加它。在这个处理程序中,我只想按正确的顺序执行我的两个处理程序。你怎么想,你会建议什么?

4 个答案:

答案 0 :(得分:7)

  

问题是我需要为它添加两个处理程序,我需要先执行一个(因为最后一个依赖于第一个)

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

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

答案 1 :(得分:2)

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

如果处理程序无法相互了解但你需要它们以某种顺序运行,我会创建一个“父”处理程序,以正确的顺序调用其他两个处理程序。

答案 2 :(得分:0)

如果您不希望默认多播委托具有默认事件add / add,我建议您实施自己的remove实施。

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/cc713648.aspx

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

   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);
        }
    }

如果您需要特定订单,请使用SortedList

答案 3 :(得分:0)

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

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