Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用第三方物流在生产者-消费者模式中告诉生产者不要等待_C#_Multithreading - Fatal编程技术网

C# 如何使用第三方物流在生产者-消费者模式中告诉生产者不要等待

C# 如何使用第三方物流在生产者-消费者模式中告诉生产者不要等待,c#,multithreading,C#,Multithreading,我使用C#的TPL实现了生产者-消费者模式。该场景描述如下 我有一个任务,负责为BlockingCollection生成作业。该集合有一个容量限制,例如最多3个作业。我有两个消费者任务,他们试图从集合中获取作业并执行它们。我还向生产者和消费者实施取消。对于生产者,当它检测到取消时,它将调用BlockingCollection.completedadding(),这允许消费者完成等待 现在有可能: 时间1:制作人在集合中放置2个工作 时间2:两个消费者抢了工作,自己跑 第三次:制作人将另外3份工作

我使用C#的TPL实现了生产者-消费者模式。该场景描述如下

我有一个任务,负责为BlockingCollection生成作业。该集合有一个容量限制,例如最多3个作业。我有两个消费者任务,他们试图从集合中获取作业并执行它们。我还向生产者和消费者实施取消。对于生产者,当它检测到取消时,它将调用BlockingCollection.completedadding(),这允许消费者完成等待

现在有可能:

时间1:制作人在集合中放置2个工作

时间2:两个消费者抢了工作,自己跑

第三次:制作人将另外3份工作放入收藏。因为它满足了收集的容量,制作人就睡着了

时间4:取消发生在两个消费者身上。他们停下来

现在制作人永远睡不着,因为没有人在工作。如何处理消费者的取消,以便他们能够唤醒生产者

我能想到的是将下面的代码放在消费者的取消处理程序中

lock(BlockingCollection){
    if(BlockingCollection.BoundedCapacity == BlockingCollection.Count) BlockingCollection.Take();
}
由于有多个消费者,它必须锁定集合。仅当BlockingCollection.BoundedCapacity等于其中的项目数时,才需要额外的获取。这个额外的拍摄将清空集合中的一个插槽,从而触发制作人醒来,检测取消本身


这是否正确?

我将使用可取消的重载
Add


当您取消消费者时,您还可以通过同时触发取消令牌或在消费者线程中触发取消令牌来确保生产者被取消。

我将使用
添加的可取消重载:


当您取消消费者时,您还可以通过同时触发取消令牌或在消费者线程中触发取消令牌来确保生产者被取消。

这是一个很好的观点。我以前读过这个重载,不确定在调用Add方法时,如果没有取消令牌,线程处于休眠状态,并且稍后消费者取消了令牌,它是否仍在工作。现在看来,当代币被取消时,这个过载可以让沉睡的制作人恢复工作,这就是我要寻找的。一个好的观点。我以前读过这个重载,不确定在调用Add方法时,如果没有取消令牌,线程处于休眠状态,并且稍后消费者取消了令牌,它是否仍在工作。现在看来,当代币被取消时,这个过载可以让沉睡的制作人恢复工作,这就是我要寻找的。