99 lines
2.6 KiB
Markdown
99 lines
2.6 KiB
Markdown
![]() |
#unity/日常积累
|
|||
|
|
|||
|
# ConcurrentQueue 类
|
|||
|
|
|||
|
- 参考
|
|||
|
|
|||
|
反馈
|
|||
|
|
|||
|
[](https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.concurrent.concurrentqueue-1?view=net-8.0#definition)
|
|||
|
|
|||
|
## 定义
|
|||
|
|
|||
|
命名空间:
|
|||
|
|
|||
|
[System.Collections.Concurrent](https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.concurrent?view=net-8.0)
|
|||
|
|
|||
|
程序集:
|
|||
|
|
|||
|
System.Collections.Concurrent.dll
|
|||
|
|
|||
|
表示线程安全的先进先出 (FIFO) 集合。
|
|||
|
|
|||
|
``` cs
|
|||
|
public class ConcurrentQueue<T> : System.Collections.Concurrent.IProducerConsumerCollection<T>, System.Collections.Generic.IEnumerable<T>, System.Collections.Generic.IReadOnlyCollection<T>, System.Collections.ICollection
|
|||
|
```
|
|||
|
|
|||
|
#### 类型参数
|
|||
|
|
|||
|
T
|
|||
|
|
|||
|
队列中包含的元素的类型。
|
|||
|
|
|||
|
继承
|
|||
|
|
|||
|
[Object](https://learn.microsoft.com/zh-cn/dotnet/api/system.object?view=net-8.0)
|
|||
|
|
|||
|
``` cs
|
|||
|
ConcurrentQueue<T>
|
|||
|
```
|
|||
|
|
|||
|
示例
|
|||
|
|
|||
|
``` cs
|
|||
|
using System;
|
|||
|
using System.Collections.Concurrent;
|
|||
|
using System.Threading;
|
|||
|
using System.Threading.Tasks;
|
|||
|
|
|||
|
class CQ_EnqueueDequeuePeek
|
|||
|
{
|
|||
|
// Demonstrates:
|
|||
|
// ConcurrentQueue<T>.Enqueue()
|
|||
|
// ConcurrentQueue<T>.TryPeek()
|
|||
|
// ConcurrentQueue<T>.TryDequeue()
|
|||
|
static void Main ()
|
|||
|
{
|
|||
|
// Construct a ConcurrentQueue.
|
|||
|
ConcurrentQueue<int> cq = new ConcurrentQueue<int>();
|
|||
|
|
|||
|
// Populate the queue.
|
|||
|
for (int i = 0; i < 10000; i++)
|
|||
|
{
|
|||
|
cq.Enqueue(i);
|
|||
|
}
|
|||
|
|
|||
|
// Peek at the first element.
|
|||
|
int result;
|
|||
|
if (!cq.TryPeek(out result))
|
|||
|
{
|
|||
|
Console.WriteLine("CQ: TryPeek failed when it should have succeeded");
|
|||
|
}
|
|||
|
else if (result != 0)
|
|||
|
{
|
|||
|
Console.WriteLine("CQ: Expected TryPeek result of 0, got {0}", result);
|
|||
|
}
|
|||
|
|
|||
|
int outerSum = 0;
|
|||
|
// An action to consume the ConcurrentQueue.
|
|||
|
Action action = () =>
|
|||
|
{
|
|||
|
int localSum = 0;
|
|||
|
int localValue;
|
|||
|
while (cq.TryDequeue(out localValue)) localSum += localValue;
|
|||
|
Interlocked.Add(ref outerSum, localSum);
|
|||
|
};
|
|||
|
|
|||
|
// Start 4 concurrent consuming actions.
|
|||
|
Parallel.Invoke(action, action, action, action);
|
|||
|
|
|||
|
Console.WriteLine("outerSum = {0}, should be 49995000", outerSum);
|
|||
|
}
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## 注解
|
|||
|
|
|||
|
备注
|
|||
|
|
|||
|
[ConcurrentQueue<T>](https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.concurrent.concurrentqueue-1?view=net-8.0)[IReadOnlyCollection<T>](https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.generic.ireadonlycollection-1?view=net-8.0)实现从 .NET Framework 4.6 开始的接口;在.NET Framework的早期版本中,[ConcurrentQueue<T>](https://learn.microsoft.com/zh-cn/dotnet/api/system.collections.concurrent.concurrentqueue-1?view=net-8.0)类未实现此接口。
|