一、概述
生产消费模式是一种常用的多线程编程模型,生产者不断向队列中添加任务,消费者从队列中取出任务进行处理。生产者和消费者在不同的线程中运行,通过队列实现线程之间的协作。在 C# 中,可以使用泛型队列 Queue 来实现生产消费模式。本文将详细介绍如何使用 C# 中的泛型队列 Queue 实现生产消费模式。
二、生产消费模式实现步骤
- 创建泛型队列 Queue
Queue<Task> taskQueue = new Queue<Task>();
- 创建生产者线程
在生产者线程中,可以使用 Enqueue
方法向队列中添加任务。
Thread producerThread = new Thread(() =>
{
while (true)
{
// 创建任务
Task task = CreateTask();
// 添加任务到队列
lock (taskQueue)
{
taskQueue.Enqueue(task);
Monitor.Pulse(taskQueue);
}
// 休眠一定时间
Thread.Sleep(100);
}
});
producerThread.Start();
- 创建消费者线程
在消费者线程中,可以使用 Dequeue
方法从队列中取出任务进行处理。如果队列中的任务为空,可以调用 Monitor.Wait
方法等待生产者线程向队列中添加任务。
Thread consumerThread = new Thread(() =>
{
while (true)
{
Task task;
lock (taskQueue)
{
while (taskQueue.Count == 0)
{
Monitor.Wait(taskQueue);
}
task = taskQueue.Dequeue();
}
// 处理任务
HandleTask(task);
}
});
consumerThread.Start();
三、示例说明
下面是两个示例,分别演示如何使用泛型队列 Queue 实现生产消费模式。
- 生产者向队列中添加随机数,消费者从队列中取出随机数并计算累加和。
private static Queue<int> numberQueue = new Queue<int>();
private static int sum = 0;
private static Thread producerThread = new Thread(() =>
{
Random random = new Random();
while (true)
{
int number = random.Next(100);
lock (numberQueue)
{
numberQueue.Enqueue(number);
Monitor.Pulse(numberQueue);
}
Thread.Sleep(100);
}
});
private static Thread consumerThread = new Thread(() =>
{
while (true)
{
int number;
lock (numberQueue)
{
while (numberQueue.Count == 0)
{
Monitor.Wait(numberQueue);
}
number = numberQueue.Dequeue();
}
sum += number;
}
});
public static void Main()
{
producerThread.Start();
consumerThread.Start();
Thread.Sleep(1000);
Console.WriteLine(sum);
}
- 生产者向队列中添加字符串,消费者从队列中取出字符串并输出。
private static Queue<string> stringQueue = new Queue<string>();
private static Thread producerThread = new Thread(() =>
{
while (true)
{
string str = Console.ReadLine();
lock (stringQueue)
{
stringQueue.Enqueue(str);
Monitor.Pulse(stringQueue);
}
}
});
private static Thread consumerThread = new Thread(() =>
{
while (true)
{
string str;
lock (stringQueue)
{
while (stringQueue.Count == 0)
{
Monitor.Wait(stringQueue);
}
str = stringQueue.Dequeue();
}
Console.WriteLine(str);
}
});
public static void Main()
{
producerThread.Start();
consumerThread.Start();
Thread.Sleep(Timeout.Infinite);
}
以上就是使用泛型队列 Queue 实现生产消费模式的完整攻略,希望能对你有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#使用泛型队列Queue实现生产消费模式 - Python技术站