如何在.NET中将信号连接成复杂电路?

3

针对一些并发代码,我希望能够将一系列信号连接在一起,就像一个电路一样。在.NET中,我们可以对一组信号执行WaitAll或WaitAny操作。我想要做的是:

WaitAny ( WaitAll (c1, c2), WaitAll (c3, c4) ) ;

很遗憾,该库不支持将这些操作组合成更复杂的树形结构。我的问题是(1)有没有办法在.NET中实现这个功能?(2)有没有任何语言的高效库可以做到这一点?
[编辑:Cory要求提供更多细节]
我想构建一个消息传递库。可能会有10K个小型并发队列,其中一些带有消息。我想从队列中获取消息并执行分配给队列的处理程序。但是,在处理程序完成之前,我无法获取下一条消息(每个队列单线程)。因此,我真正想要的是在弹出和执行下一个项目之前等待队列(是否有消息?)和代码(是否完成上一个消息?)。
3个回答

1

我甚至不敢相信我正在建议这个,但您可以拥有其他线程执行WaitAll调用并触发单独的信号(每组WaitAll一个唯一的信号),您在WaitAny中进行监听。这闻起来非常不好,并且似乎对于本应简单的事情过于复杂。我可能会后悔点击发布您的答案 ;-)

ManualResetEvent _Group1Event = new ManualReset(false);
ManualResetEvent _Group2Event = new ManualReset(false);

void SomeThread()
{
    ...
    WaitHandle.WaitAny(_Group1Event, _Group2Event);
    ...
}

void Group1WatcherThread()
{
    ...
    if (WaitHandle.WaitAll(c1, c2))
    {
       _Group1Event.Set();
    }
    ...
}

void Group2WatcherThread()
{
    ...
    if (WaitHandle.WaitAll(c3, c4))
    {
       _Group2Event.Set();
    }
    ...
}

我不确定我的WaitAll/WaitAny方法调用是否正确,但这个例子只是为了演示思路而不是提供完整的解决方案。


我也不敢相信我正在点赞这个。 :) - Tanzelax
不幸的是,这将为电路中的每个子树分配一个线程。我需要近10K个线程,所以这不可扩展。API的设计很困难,因为例如返回值如何告诉您哪个子树实际上在WaitAny中被触发?想想信号的非常深的树形结构。 - projectshave
@projectshave:每个组一个线程不会扩展,但是您可以创建一个单个线程负责WaitAll并设置较低的超时时间。仍然不可扩展。 WaitAny返回您传递的数组中对象的索引,因此您知道哪个信号被触发。也许您可以更新您的问题,并尝试寻找比您描述的WaitAny(WaitAll(),WaitAll())方法更好的解决方案。 - Cory Charlton

1

-1

我不相信.NET或任何语言都支持这个功能。我必须使用低级原语来完成它。


是的,现在有一种方法,使用Rx扩展。 - Richard Anthony Freeman-Hein
如果您更新了您的答案,我可以撤销投票。我不是故意在这里投反对票的。 - Richard Anthony Freeman-Hein

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接