相关疑难解决方法(0)

在C#中实现生产者/消费者模式

如何使用事件和代理在C#中实现Producer/Consumer模式?在使用这些设计模式时,我需要注意什么?我需要注意哪些边缘情况?

.net c# events design-patterns producer-consumer

13
推荐指数
1
解决办法
2万
查看次数

取消BlockingCollection.GetConsumingEnumerable()并处理剩下的内容

我有一个流程生成工作,第二个流程使用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发生的迹象.

这个问题试图解释使用取消令牌,但似乎它没有正确使用它.(论证:如果它有效,那么它"足够正确".) …

.net c# multithreading blockingcollection

7
推荐指数
2
解决办法
4349
查看次数