假设我有一个有2个订阅者的事件(一切都发生在同一个线程中) - 一个订阅者写入一个日志文件,另一个订阅者显示一个MessageBox。
如果MessageBox是订阅列表中的第一个,则在用户关闭消息框之后才会写入日志条目。因此,日志条目中的时间实际上是消息框关闭的时间,而不是事件发生的时间。
似乎最好的解决方案是让日志编写者在显示消息框的代码之前订阅该事件。但是,在这里有一个类似的问题:Are event subscribers called in order of subscription?
最好的答案是永远不要依赖订阅者的顺序。那么如何在不担心订单冲突的情况下防止冲突?
答案 0 :(得分:2)
所有个人活动订阅者都需要与他人合作。正确的事情是显示MessageBox启动后台线程并从那里显示MessageBox的事件。
答案 1 :(得分:1)
根据MSDN C# programming guide中事件的文档,事件具有以下属性(关键点为粗体):
看起来最好的选择是在事件上使用BeginInvoke。
答案 2 :(得分:0)
已编辑:
您是否掌控了事件代码?如果是这样,你可以确保它从未以病态奇怪的方式实现重新排序。您甚至可以将其记录为事件本身的一部分:“此事件的处理程序始终以订阅顺序同步调用。”
说实话,我真的希望没有的任何事件都明确记录下来。