【发布时间】:2015-10-07 13:18:53
【问题描述】:
这需要先解释一下。有一个工作线程必须引发一些事件:
Task.Run(() =>
{
for(int i = 0; i < 123456789; i++)
{
... // some job
OnSomeEvent(i);
}
});
同步上升事件将阻塞作业,直到所有事件处理程序完成:
void OnSomeEvent(int i) => SomeEvent?.Invoke(this, new SomeEventArgs(i));
异步事件上升不会再阻塞作业(耶!)
void OnSomeEvent(int i) => Task.Run(() => SomeEvent?.Invoke(this, new SomeEventArgs(i)));
但是现在还有另一个问题:事件没有按正确的顺序接收:
OnSomeEvent(1);
OnSomeEvent(2);
OnSomeEvent(3);
...
// event handler
SomeEvent += (s, e) => Console.WriteLine(e.I);
// possible output
1
3
2
问题:如何实现以正确顺序发生的异步事件?
最近我学到了什么Dispatcher.InvokeAsyncuses queue。看来我必须做类似的事情。如果我必须这样做:1)它应该是调用者的工作还是 2)我应该保持同步上升事件并且接收者必须组织生产者/消费者以防止工作阻塞?或者也许还有其他方法?
P.S.:这与ContinueWhith.. 无关,除非存储任务列表是一个正确的解决方案。我关心的是如何在以下情况下实现即发即弃事件:a) 调用者未被阻止 2) 事件以相同的顺序接收。
P.P.S.:我不知道如何让 MCVE 重现问题。它出现在实际项目中,UI 很重,线程很多。
【问题讨论】:
-
也许你想使用一个先进先出的队列而不是使用事件,一旦准备好并处理它,就简单地退出队列。
-
@YuvalItzchakov,这意味着当有东西被添加到队列时触发一些事件。来电者必须有队列和上升事件。订阅者(可能很多)将收到事件并做什么?
标签: c# multithreading events asynchronous