C# BlockingCollection
时间: 2024-10-02 15:02:12 浏览: 37
C#实现MYQQ
`BlockingCollection<T>`是.NET Framework中的一个并发容器,它允许线程安全地添加和取出元素。这个类在多线程编程中非常有用,尤其是在消息传递和工作队列的场景中。`BlockingCollection`的主要特点包括:
1. **线程安全**:当你向集合添加或移除元素时,它会自动同步,防止竞态条件。
2. **阻塞**:当试图从空的集合中获取元素(Take)或尝试添加元素到满的集合(Add)时,该操作会阻塞,直到有了可用的操作。
3. **容量控制**:可以设置最大容量,超过此限制的添加会被阻塞,直到有元素被移出。
4. **支持循环队列**:通过设置`BoundedCapacity`属性,它实际上实现了FIFO(先进先出)的工作模式。
5. **动态大小**:如果没有预设容量,它可以自动调整大小以适应添加和移除的元素。
在你的场景中,`BlockingCollection`可以用于保存计算的结果,直到所有的线程都完成了它们的任务。例如,在处理每个数据请求时,将计算结果放入`BlockingCollection`,然后主线程负责从队列中取出并发送结果,这样可以保证结果的顺序正确,同时避免了资源竞争。
下面是一个简单的使用示例:
```csharp
BlockingCollection<int> resultQueue = new BlockingCollection<int>(new ConcurrentBag<int>());
Task.Factory.StartNew(() =>
{
for (int i = 0; i < 30; i++)
{
int calculationResult = PerformComplexCalculation(i);
resultQueue.Add(calculationResult);
}
});
while (resultQueue.Count > 0)
{
int result = resultQueue.Take(); // 如果队列非空则获取结果
// 发送给客户端
}
```
阅读全文