我有一个线程可以从并发队列中获取消息并将它们写入网络流。线程内部的循环如下所示:
while (!cancel.IsCancellationRequested)
{
messageBus.outboundPending.WaitOne();
var message = messageBus.GetFrom(Direction.Outbound);
if (message == null) { continue; }
MessageWriter.WriteMessage(networkStream, message, cancel, OnStreamClose).Wait(cancel);
}
要求是如果设置了取消令牌,则线程会停止。但是,由于它等待队列中的未决消息,因此该线程将保持阻塞状态。我如何“组合”取消令牌和出站事件,以便如果其中任何一个设置,线程解除阻塞?
我能想到的唯一令人费解的方法是使用新的第三个事件替换outboundPending事件,并启动两个新线程:一个等待出站事件,另一个等待取消事件,并让他们在解锁时设置第三个事件。但那感觉非常糟糕。
答案 0 :(得分:4)
尝试WaitHandle.WaitAny
并添加CancellationToken.WaitHandle
。
可以找到关于可取消的WaitAll的讨论here
答案 1 :(得分:0)
使用WaitOne(TimeSpan)方法。如果已发出信号,它将返回true
,如果达到超时,则返回false
。
例如,如果您发送TimeSpan.FromSeconds(1)
并且在没有信号的情况下传递了第二个,则执行将继续,并且该方法将返回false
。如果给出了信号,它将返回true
。