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