我有一个线程从并发队列中获取消息并将它们写入网络流。线程内的循环如下所示:
while (!cancel.IsCancellationRequested)
{
messageBus.outboundPending.WaitOne();
var message = messageBus.GetFrom(Direction.Outbound);
if (message == null) { continue; }
MessageWriter.WriteMessage(networkStream, message, cancel, OnStreamClose).Wait(cancel);
}
要求是如果设置了取消标记,则线程停止。但是,由于它等待队列中的未决消息,该线程将保持阻塞状态。我如何“组合”取消 token 和出站事件,以便如果设置了其中一个,线程就会解除阻塞?
我能想到的唯一复杂的方法是用新的第三个事件替换 outboundPending 事件,并启动两个新线程:一个等待出站事件,另一个等待取消事件,并让他们在解锁时设置第三个事件。但这感觉真的很糟糕。
最佳答案
尝试 WaitHandle.WaitAny
并包含 CancellationToken.WaitHandle
。
可以找到关于可取消 WaitAll 的讨论 here
关于C# 如何让线程等待两个手动重置事件中的任何一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27210769/