我有一个流程生成工作,第二个流程使用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
}
}
}
Run Code Online (Sandbox Code Playgroud)
我的制作人有:
private CancellationTokenSource StopFlag = new CancellationTokenSource ();
MyConsumer.CancellationToken = StopFlag.Token;
// Make the consumer spawn it's consuming thread...
StopFlag.Cancel ();
MyConsumer.BlockingCollection.CompleteAdding ();
Run Code Online (Sandbox Code Playgroud)
当我尝试这个时,我没有得到OperationCancelledException发生的迹象.
这个问题试图解释使用取消令牌,但似乎它没有正确使用它.(论证:如果它有效,那么它"足够正确".) …