将生产者 - 消费者与等待一个一个的混合(WhenAny)

时间:2013-11-04 23:31:58

标签: c# task-parallel-library producer-consumer c#-5.0

我最近一直致力于我的第一个TPL项目,我正在尝试混合使用一些显然不能同时使用的模式。

鉴于大量的IO绑定的http请求任务,以及体面但不是无限的并发服务器容量,我需要一个生产者 - 消费者实现,允许阻塞收集在他们完成时完成任务。这里与通常的BlockingCollection<>场景的区别在于,任意Take()方法不会按照它们完成的顺序删除任务。基本上,我需要混合使用BlockingCollection<>.WhenAny().Remove()

到目前为止我的选择是:

  1. 我可以使用BlockingCollection<byte>为密钥ConcurrentDictionary<int, Task<T>>配对Task.Id的包装,并使用.ToDictionary(t => t.Id)配对。.GetConsumingEnumerable()。阻塞集合只是用于流量管理的标记包,字典提供了任何可枚举和删除的时间。这是有效的,但它有点胶带&amp; b丝。

  2. 我可以尝试将.WhenAny()传递给.DefaultConnectionLimit,这在编辑器中看起来很棒,但是当扫描完成的任务时,当阻塞集合被任意消耗时,必然会失败。我还没有尝试过,但它不应该像我想的那样工作。

  3. 这似乎是一种有点不寻常的情况;我将.Add()提升到120到720之间,具体取决于我所定位的端点,然后以尽可能多的负载发送垃圾邮件。我找不到明显的并发集合和/或阻塞包装器,它们将.Remove()IEnumerable<>和非删除{{1}}放在一起。我错过了什么吗?

0 个答案:

没有答案