简单的场景 - 我想在
我知道没有办法使用
我能想到的最简单的方法是在具有超时的
BlockingCollection<T>
上阻塞(如果它为空)。另一方面,我想在用于信号线程需要终止的 ManualResetEvent 对象上阻塞。我知道没有办法使用
WaitHandle.WaitAny
,因为在 BlockingCollection<T>
上阻塞会同时返回一个项目,并且不容易适应由 WaitHandle.WaitAny
所规定的 API。我能想到的最简单的方法是在具有超时的
BlockingCollection<T>
上阻塞,然后在等待处理程序上等待 0 超时时间,类似于这样:ManualResetEvent term = ...;
BlockingCollection<T> coll = ...;
while (true)
{
T obj;
bool found = coll.TryTake(out obj, 500);
if (term.WaitOne(0))
{
break;
}
if (found)
{
// process the obj
}
}
但我觉得应该有更优雅的解决方案,也许可以使用其他东西代替BlockingCollection<T>
?
欢迎提出任何想法。
编辑1
如果需要更优雅的解决方案,我可以放弃使用MRE并改用取消令牌。
BlockingCollection<T>
的包装器,然后在信号量和手动重置事件上调用WaitHandle.WaitAny
。 - CameronCancellationToken
来向工作单元发出取消信号,而不是使用 MRE。 - ServyCancellationToken
。 - Daniel Kelley