0

我最近一直在做我的第一个 TPL 项目,我正在尝试混合一些显然不经常一起使用的模式。

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

到目前为止,我的选择是:

  1. 我可以使用for 键BlockingCollection<byte>对包装器进行 kitbash 包装器:。阻塞集合只是一个用于流量管理的令牌包,字典提供了一个 when-any 可枚举和一个 remove。这行得通,但它有点胶带和钢丝绳。ConcurrentDictionary<int, Task<T>>Task.Id.ToDictionary(t => t.Id)

  2. 我可以尝试传递.GetConsumingEnumerable()to .WhenAny(),这在编辑器中看起来很棒,但由于在扫描枚举以查找已完成的任务时会任意消耗阻塞集合,因此必然会失败。我还没有尝试过,但它不应该按照我想要的方式工作。

  3. ?

这似乎有点不寻常。根据我.DefaultConnectionLimit的目标端点,我在 120 到 720 之间增加,然后用它可以处理的尽可能多的负载向它发送垃圾邮件。我找不到明显的并发收集和/或阻塞包装器,它们同时提供.Add().Remove()和一个非删除IEnumerable<>。我错过了什么吗?

4

0 回答 0