我有一个进程生成工作,第二个进程使用
目前,我的消费者生成一个线程,该线程具有一个
搜索了这个问题告诉我,我需要使用一个
当我尝试这样做时,没有迹象表明OperationCancelledException曾经发生过。 这个问题试图解释取消令牌的使用,但似乎没有正确使用。(论据:如果它起作用,则“足够正确”。)而这个问题似乎是我的问题的完全重复,但没有示例。(同这里。)
因此,再次强调:如何在需要使用不同方法处理取消后队列中剩余项的情况下,正确使用CancellationToken和BlockingCollection.GetConsumingEnumerable()?
(我认为我的问题集中在正确使用CancellationToken上。我的所有测试都没有表明进程实际上被取消了。(StopFlag.IsCancellationRequested始终等于false。))
BlockingCollection<>
消费这些工作。当我关闭程序时,我需要让消费者停止消费工作,但我仍然需要快速记录尚未被消费的挂起工作。目前,我的消费者生成一个线程,该线程具有一个
foreach (<object> in BlockingCollection.GetConsumingEnumerable())
循环。当我停止程序时,我的生产者调用 Consumer.BlockingCollection.CompleteAdding()
。结果我发现我的消费者继续处理队列中的所有内容。搜索了这个问题告诉我,我需要使用一个
CancellationToken
。所以我试着用它:private void Process () { // This method runs in a separate thread
try {
foreach (*work* in BlockingCollection.GetConsumingEnumerable(CancellationToken)) {
// Consume
}
}
catch (OperationCancelledException) {
foreach (*work* in BlockingCollection.GetConsumingEnumerable()) {
// quickly log
}
}
}
我的制作人有:
private CancellationTokenSource StopFlag = new CancellationTokenSource ();
MyConsumer.CancellationToken = StopFlag.Token;
// Make the consumer spawn it's consuming thread...
StopFlag.Cancel ();
MyConsumer.BlockingCollection.CompleteAdding ();
当我尝试这样做时,没有迹象表明OperationCancelledException曾经发生过。 这个问题试图解释取消令牌的使用,但似乎没有正确使用。(论据:如果它起作用,则“足够正确”。)而这个问题似乎是我的问题的完全重复,但没有示例。(同这里。)
因此,再次强调:如何在需要使用不同方法处理取消后队列中剩余项的情况下,正确使用CancellationToken和BlockingCollection.GetConsumingEnumerable()?
(我认为我的问题集中在正确使用CancellationToken上。我的所有测试都没有表明进程实际上被取消了。(StopFlag.IsCancellationRequested始终等于false。))
GetConsumingEnumerable
会等待更多的项被添加。在catch
中使用集合本身的foreach
。 - Dustin Kingenpublic BlockingCollection<cOrder> OrderQueue = new BlockingCollection<cOrder> ();
- Jason