事件订阅者是按订阅顺序调用的吗?假设按订阅顺序调用事件订阅者是否安全?示例:voidOne(objectsender,EventArgse){}voidTwo(objectsender,EventArgse){}eventEventHandlerfoo;foo+=一;foo+=二;One()在事件触发时一直开启Two()之前调用过?编辑:你不应该依赖它,我只是想。这个想法是多播委托类似于COMMAND模式。所以我只是想知道。通常你会使用一个包含COMMAND命令的集合,这样你就可以撤消/重做/任何事情。鉴于该实施,是的,它们将始终按该顺序被调用。如果事件实际上使用了一些奇怪而美妙的方式来处理订阅,它可以做不同的事情——但“正常”的实现会做正确的事情。需要明确的是,订阅事件处理程序只是意味着调用事件的相应“添加”部分。如果事件通过以下方式处理:myHandler+=value;被翻译成myHandler=Delegate.Combine(myHandler,value);Delegate.Combine保证排序。但是,如果您有这样的事件:privateLinkedListeventHandlers=newLinkedList;公共事件EventHandlerFoo{添加{eventHandlers.AddFirst(value);}remove{//在这里也做一些事情}}通过执行以下操作关闭事件:然后将以相反的顺序调用处理程序。简介:对于所有理智的事件,您都可以依赖排序。理论上,事件可以为所欲为,但我从未见过不保持正确顺序的事件。密切注意JonSkeet给出的警告-“Giventheimplementation...”。换句话说,进行最细微的更改(多线程、额外的处理程序等),您就有可能失去执行顺序的不变性。不要依赖事件排序。所有事件调度在逻辑上应该是独立的,就好像它们是并行发生的一样。事件是逻辑上独立的操作。我会更进一步并断言,如果您必须假定事件触发顺序,则说明您存在严重的设计缺陷和/或误用事件。即使以正确的顺序调用它们,我也尽量不要编写依赖于前一个委托被触发才能正常运行的代码。如果Two()依赖于One()正在做什么,那么要么附加一个以正确顺序调用这两个方法的委托,要么在必要时让Two()调用One()。快速回答是“这不关你的事”:)事件本质上是异步的。这意味着您不必等待事件被触发或期望它在给定时间发生。它们只是发生了,然后你就采取了行动。想知道“何时”或试图弄清楚“如何”会打破这种本性。也许在这种情况下您不需要基于事件的方法来完成工作?JonSkeet所说的对于当前实现在技术上是正确的,但它可能不会出现在c#8.5或VBasic15.0中。依赖实施细节总是弊大于利。通常,事件订阅者的行为应该彼此独立。无论它们是按订阅的顺序调用、以订阅的相反顺序调用,还是以每次引发事件时任意更改的看似随机的顺序调用,都不应该有什么不同。订阅者不应该关心在他们之前或之后执行的其他订阅者。但是,在某些情况下,可能会在这种顺序很重要的情况下使用事件。事件处理程序可以传递一个可变对象,并且应该使用该对象以前的处理程序的突变。在这种情况下,如果事件的有意义的操作要求它们以特定的顺序执行,并且只要满足订阅者的任何日志记录要求,就应该期望事件将以给定的顺序执行。以上是C#学习教程:事件订阅者是按订阅顺序调用的吗?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
