我如何等待异步事件被调用?

时间:2016-06-09 19:20:57

标签: c#

我在C#中有一个方法,需要等待事件发生。它将数据发送到客户端,但它必须等待event Action被触发(在收到响应数据包时会触发)。如何在调用处理程序之前阻止方法的执行?

2 个答案:

答案 0 :(得分:2)

此解决方案运行良好,并在不再需要时从事件中删除处理程序。

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

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

然而,有一个主要的警告(有一个相当简单的解决方法):调用线程将无限期地阻塞,直到调用该事件。这意味着如果从未调用该事件,您的程序将挂。解决此问题的方法是将evt.WaitOne();更改为evt.WaitOne(SOME_TIMEOUT);

答案 1 :(得分:1)

另一种方法是使用TaskCompletionSource请参阅https://social.msdn.microsoft.com/Forums/en-US/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 an async method implemented with TaskCompletionSource