簡體   English   中英

如何等待異步事件被調用?

[英]How do I wait for an asynchronous event to be called?

我在C#中有一個方法,需要等待事件發生。 它正在將數據發送到客戶端,但是它必須等待event Action被觸發(在收到響應數據包時觸發)。 在調用處理程序之前,如何阻止方法的執行?

此解決方案效果很好,一旦不再需要該處理程序,便將其從事件中刪除。

AutoResetEvent evt = new AutoResetEvent(false);
Action handler = () => {
  //Do stuff
  evt.Set();
}

Event += handler;
evt.WaitOne();
Event -= handler;

但是,有一個主要警告(有一個相當簡單的解決方法): 調用線程將無限期阻塞,直到事件被調用為止。 這意味着,如果永不調用該事件,則程序將掛起。 解決方法是簡單地更改evt.WaitOne(); evt.WaitOne(SOME_TIMEOUT);

一種替代方法是使用TaskCompletionSource請參見https://social.msdn.microsoft.com/Forums/zh-CN/a30ff364-3435-4026-9f12-9bd9776c9a01/signalling-await?forum=async

然后變成:

TaskCompletionSource tsc = new TaskCompletionSource<bool>();
Action handler = () => {
  //Do stuff
  tsc.SetResult(true);
}

Event += handler;
await tsc.Task;
Event -= handler;

所引用的討論解釋了為什么這是更輕量級的解決方案。

另外,它不會阻塞線程,並且可以通過使用CancellationTokenSource允許超時(如果未調用事件)和/或取消(如果應用程序被關閉),請參見Timeout用TaskCompletionSource實現的異步方法

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM