是否有与Java的BlockingQueue.drainTo(Collection)方法等效的C#?



我正在构建一个多线程C#应用程序,其中多个线程为队列上的元素贡献力量。单个线程正在使用同一队列上的元素。我希望单个线程对传入元素的元素进行一些缩减/合并,因此理想情况下,它会查看队列上的所有新元素,减少它们,然后在缩减后处理条目。有点像这样:

while (true)
{
Collection<Elem> elements = queue.TakeAll();
Collection<Elem> reducedElements = Reduce(elements);
for (Elem e in reducedElements)
{
process(e);
}
}

但显然没有任何TakeAll()方法。根据Java的经验,我已经习惯了BlockingQueue的drainTo方法,它提供了我感兴趣的东西

我可以通过使用TryTake自己实现一些东西,直到队列为空。但这有一个风险,即生产线程可能也忙于生产,这将导致没有有限的集合结束来减少和处理。我基本上是在寻找一种方法,把所有东西都从队列中取出,让它空着,但提供一个可以处理的集合。

查看命名空间System中的ConcurrentQueue。集合。同时发生的

此队列用于线程安全操作。

您可以轻松地为自己的目的添加一个扩展方法。

public static class Extensions
{
public static List<T> DrainTo<T>(this System.Collections.Concurrent.ConcurrentQueue<T> poConcurrentQueue)
{
List<T> loList = new List<T>();
T loElement;
while (poConcurrentQueue.TryDequeue(out loElement))
loList.Add(loElement);
return loList;
}
}

并像这样使用:

System.Collections.Concurrent.ConcurrentQueue<string> loConcurrentQueue = new System.Collections.Concurrent.ConcurrentQueue<string>();
loConcurrentQueue.Enqueue("Element1");
loConcurrentQueue.Enqueue("Element2");
var loList = loConcurrentQueue.DrainTo();

最新更新