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

标签 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);
}

要求是如果设置了取消标记,则线程停止。但是,由于它等待队列中的未决消息,该线程将保持阻塞状态。我如何“组合”取消 token 和出站事件,以便如果设置了其中一个,线程就会解除阻塞?

我能想到的唯一复杂的方法是用新的第三个事件替换 outboundPending 事件,并启动两个新线程:一个等待出站事件,另一个等待取消事件,并让他们在解锁时设置第三个事件。但这感觉真的很糟糕。

最佳答案

尝试 WaitHandle.WaitAny 并包含 CancellationToken.WaitHandle

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

关于C# 如何让线程等待两个手动重置事件中的任何一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27210769/

相关文章:

c# - 为什么 c# 找不到属性?网站

android - 如何在不同的线程上运行不同的进程并将输出输出到第一个线程? Python

java - JSF + WatchService + 线程

c - 线程执行时陷入无限循环

c# - 这行 C# 代码实际上做了什么?

c# - 序列化事件

c# - Take(10) vs TOP 10 使用 SqlDataReader?

c# - 在C#中计算给定日期和当前日期之间的小时差

events - 在 XML-RPC 或 SOAP 中实现回调

c# - 在 Unity 中同一网络上的 2 部 iOS 手机之间传输小数据