2

我有事件,例如:

public event EventHandler<NewReadyMessageEventArgs> NewReadyMessage

问题是我需要为其附加两个处理程序,并且我需要在另一个之前执行一个(因为最后一个取决于第一个)。即我需要一定的处理程序执行顺序。

我知道实际上处理程序将被一一执行,因此我只需要按正确的顺序附加它们,但这将是非常容易出错的设计。

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

4

4 回答 4

7

问题是我需要为其附加两个处理程序,并且我需要先执行一个(因为最后一个取决于第一个)

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

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

于 2012-08-20T18:51:34.107 回答
2

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

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

于 2012-08-20T18:53:03.207 回答
1

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如果您想要特定的订单,请使用...

于 2012-08-20T18:51:31.520 回答
0

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

如果顺序很重要,则有两个事件,并且有一个在另一个之后立即被触发。例如,您可以在 ASP 中的页面生命周期中看到这一点。有很多事件,在某些情况下,它们都一个接一个地被触发,除了保证前一个事件的所有处理程序都运行之外,它们之间确实存在一些事情。这听起来就像你在这里的情况。

于 2012-08-20T19:10:49.013 回答