using System;
using System.Collections.Concurrent;
using System.Diagnostics;
using System.Threading.Tasks;
namespace ThreadCQueue
{
class Program
{
const int count = 10000000;
const int threadCount = 100;
static void Main(string[] args)
{
Task t = RunProgram();
t.Wait();
Console.WriteLine("ok");
Console.ReadKey();
}
static async Task RunProgram()
{
var taskQueue = new ConcurrentQueue<CustomTask>();
//生产
var taskSource = Task.Run(() => TaskProducer(taskQueue));
await taskSource;
//消费者
Stopwatch sw = new Stopwatch();
sw.Start();
var processors = new Task[threadCount];
for (var i = 1; i <= threadCount; i++)
{
string processordId = i.ToString();
processors[i - 1] = Task.Run(() => TaskProcessor(taskQueue, $"Processor {processordId}"));
}
await Task.WhenAll(processors);
//停止计时
sw.Stop();
Console.WriteLine("用时2:" + sw.ElapsedMilliseconds + "");
}
static async Task TaskProducer(ConcurrentQueue<CustomTask> queue)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (var i = 1; i <= count; i++)
{
//await Task.Delay(50);
var workItem = new CustomTask { Id = i };
queue.Enqueue(workItem);
}
//停止计时
sw.Stop();
Console.WriteLine("用时:" + sw.ElapsedMilliseconds + "");
}
static async Task TaskProcessor(ConcurrentQueue<CustomTask> queue, string name)
{
CustomTask workItem;
//await GetRandomDelay();
while (queue.TryDequeue(out workItem))
{
//Console.WriteLine($"消费 {workItem.Id}===>{name}");
//await GetRandomDelay();
}
}
static Task GetRandomDelay()
{
int delay = new Random(DateTime.Now.Millisecond).Next(1, 500);
return Task.Delay(delay);
}
}
class CustomTask
{
public int Id { get; set; }
}
}
1000万条,入队出队大概1秒