我有事件,例如:
public event EventHandler<NewReadyMessageEventArgs> NewReadyMessage
问题是我需要为它添加两个处理程序,我需要先执行一个(因为最后一个依赖于第一个)。即我需要处理器执行的某些顺序。
据我所知,实际上处理程序将逐个执行,所以我只需要按正确的顺序附加它们,但这将是非常错误的设计。
我想创建单独的处理程序并附加它。在这个处理程序中,我只想按正确的顺序执行我的两个处理程序。你怎么想,你会建议什么?
答案 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中查看页面生命周期。有很多事件,在某些情况下,它们都是一个接一个地被解雇,事情真的在它们之间,而不是保证前一个事件的所有处理程序都运行。这听起来就像你的情况一样。