【发布时间】:2019-06-06 09:03:22
【问题描述】:
我有一个异步调用的 EventHandler(使用 BeginInvoke/EndInvoke)。
提供的 EventArgs 包含一个递增值。
事件正在快速连续地多次引发;引发事件的顺序是,它们的 EventArgs 值在每次后续调用时递增。
在订阅者中,我试图按照它们被引发的顺序处理这些事件,并且我在订阅者中有一个锁定,以确保我只能同时处理一个事件,但是,我有一个问题是锁定并不总是按照请求的顺序进行处理,导致事件被无序处理。
我在这里看到:Does lock() guarantee acquired in order requested? 这在某种程度上是意料之中的;即我不能依赖按请求顺序获取锁。
该问题的一个答案将我引导到此处的排队锁实现:Is there a synchronization class that guarantee FIFO order in C#?
在我走这条路之前,我有三个问题:-
- 如果(快速)引发多个事件,是否总是按照引发事件的顺序调用订阅者的处理程序?
- 如果我像上面提到的那样实现一个排队锁,我可以依靠
Enter()方法以正确的顺序调用吗? (即,即使在“事件 1”之后触发了“事件 2”,“事件 2”仍会在“事件 1”之前到达我的订阅者中的queuedLock.Enter()的风险);和 - 鉴于 EventHandler 需要是异步的(以防止订阅者阻塞线程),这对 EventHandler 来说是不可能/合理的吗?我是否需要实现某种单独的异步事件队列?
【问题讨论】:
标签: c# multithreading event-handling synchronization locking