這首先需要一些解釋。另外有一個上升的一些事件工作線程:沒有按照正確順序阻塞並接收事件的上升事件
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.InvokeAsync
uses queue。看起來我必須做類似的事情。如果我必須這樣做:1)是否應該是來電者的工作?2)我是否應該同步上升事件,並且接收者必須組織生產者/消費者以防止工作被阻止?或者,也許有另一種方式?
P.S .:這與ContinueWhith
無關..除非存儲任務列表是一個適當的解決方案。我關心的是如何在以下情況下實施「即發即停」事件:a)呼叫者未被阻止2)以相同的順序收到事件。
P.P.S .:我不知道如何讓MCVE重現這個問題。它出現在真實的項目重UI,大量的線程等
也許不是使用事件要使用隊列是先進先出,並且一旦準備好並處理它就簡單地退出隊列。 –
@YuvalItzchakov,這意味着當某些事情被添加到隊列中時觸發某個事件。來電者必須有排隊和上升事件。訂閱者(可能很多)會收到活動並做什麼? – Sinatr