如何防止事件的订阅者相互冲突?

时间:2009-12-10 22:44:09

标签: c# events event-handling

假设我有一个有2个订阅者的事件(一切都发生在同一个线程中) - 一个订阅者写入一个日志文件,另一个订阅者显示一个MessageBox。

如果MessageBox是订阅列表中的第一个,则在用户关闭消息框之后才会写入日志条目。因此,日志条目中的时间实际上是消息框关闭的时间,而不是事件发生的时间。

似乎最好的解决方案是让日志编写者在显示消息框的代码之前订阅该事件。但是,在这里有一个类似的问题:Are event subscribers called in order of subscription?

最好的答案是永远不要依赖订阅者的顺序。那么如何在不担心订单冲突的情况下防止冲突?

3 个答案:

答案 0 :(得分:2)

所有个人活动订阅者都需要与他人合作。正确的事情是显示MessageBox启动后台线程并从那里显示MessageBox的事件。

答案 1 :(得分:1)

根据MSDN C# programming guide中事件的文档,事件具有以下属性(关键点为粗体):

  • 发布商确定何时举起活动;订阅者确定响应该事件采取了什么行动。
  • 一个事件可以有多个订阅者。订阅者可以处理来自多个发布者的多个事件。
  • 永远不会提出没有订阅者的活动。
  • 事件通常用于指示用户操作,例如按钮单击或图形用户界面中的菜单选择。
  • 当一个事件有多个订阅者时,在引发事件时会同步调用事件处理程序。要异步调用事件,请参阅Calling Synchronous Methods Asynchronously
  • 事件可用于同步线程。
  • 在.NET Framework类库中,事件基于EventHandler委托和EventArgs基类。

看起来最好的选择是在事件上使用BeginInvoke。

答案 2 :(得分:0)

已编辑:

您是否掌控了事件代码?如果是这样,你可以确保它从未以病态奇怪的方式实现重新排序。您甚至可以将其记录为事件本身的一部分:“此事件的处理程序始终以订阅顺序同步调用。”

说实话,我真的希望没有的任何事件都明确​​记录下来。