队列分为阻塞队列和非阻塞队列,今天在优快云上看到了两个Demo,摘录如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.Concurrent;
using System.Threading;
using System.Collections;
namespace ConcurrentQueueDemo
{
class Program
{
static void Main(string[] args)
{
#region ConcurrentQueue
// 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);
#endregion
#region
// Creates and initializes a new Queue.
Queue myQ = new Queue();
myQ.Enqueue("Hello");
myQ.Enqueue("World");
myQ.Enqueue("!");
// Displays the properties and values of the Queue.
Console.WriteLine("myQ");
Console.WriteLine("\tCount: {0}", myQ.Count);
Console.Write("\tValues:");
PrintValues(myQ);
#endregion
Console.ReadKey();
}
public static void PrintValues(IEnumerable myCollection)
{
foreach (var obj in myCollection)
Console.Write(" {0}", obj);
Console.WriteLine();
}
}
}
代码相信大家都能看得懂,不在赘述!