C#如何让线程等待两个手动重置事件中的任何一个?

时间:2014-11-30 06:42:58

标签: c# multithreading events block

我有一个线程可以从并发队列中获取消息并将它们写入网络流。线程内部的循环如下所示:

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事件,并启动两个新线程:一个等待出站事件,另一个等待取消事件,并让他们在解锁时设置第三个事件。但那感觉非常糟糕。

2 个答案:

答案 0 :(得分:4)

尝试WaitHandle.WaitAny并添加CancellationToken.WaitHandle

可以找到关于可取消的WaitAll的讨论here

答案 1 :(得分:0)

使用WaitOne(TimeSpan)方法。如果已发出信号,它将返回true,如果达到超时,则返回false

例如,如果您发送TimeSpan.FromSeconds(1)并且在没有信号的情况下传递了第二个,则执行将继续,并且该方法将返回false。如果给出了信号,它将返回true