C#使用泛型队列Queue实现生产消费模式

一、概述

生产消费模式是一种常用的多线程编程模型,生产者不断向队列中添加任务,消费者从队列中取出任务进行处理。生产者和消费者在不同的线程中运行,通过队列实现线程之间的协作。在 C# 中,可以使用泛型队列 Queue 来实现生产消费模式。本文将详细介绍如何使用 C# 中的泛型队列 Queue 实现生产消费模式。

二、生产消费模式实现步骤

  1. 创建泛型队列 Queue
Queue<Task> taskQueue = new Queue<Task>();
  1. 创建生产者线程

在生产者线程中,可以使用 Enqueue 方法向队列中添加任务。

Thread producerThread = new Thread(() =>
{
    while (true)
    {
        // 创建任务
        Task task = CreateTask();

        // 添加任务到队列
        lock (taskQueue)
        {
            taskQueue.Enqueue(task);
            Monitor.Pulse(taskQueue);
        }

        // 休眠一定时间
        Thread.Sleep(100);
    }
});

producerThread.Start();
  1. 创建消费者线程

在消费者线程中,可以使用 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 实现生产消费模式。

  1. 生产者向队列中添加随机数,消费者从队列中取出随机数并计算累加和。
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);
}
  1. 生产者向队列中添加字符串,消费者从队列中取出字符串并输出。
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技术站

(0)
上一篇 2023年6月7日
下一篇 2023年6月7日

相关文章

  • C#实现IDisposable接口释放非托管资源

    下面是“C#实现IDisposable接口释放非托管资源”的完整攻略: 什么是IDisposable接口 IDisposable接口是一个管理非托管资源的机制,它允许程序员自行释放非托管资源。IDisposable接口包含Dispose()方法,该方法释放由实现对象持有的所有资源。 下面是实现IDisposable接口的步骤 实现IDisposable接口并…

    C# 2023年6月7日
    00
  • 将字符串转换成System.Drawing.Color类型的方法

    将字符串转换成System.Drawing.Color类型的方法可以使用System.Drawing.Color类中的静态方法ColorTranslator.FromHtml或ColorTranslator.FromName。 1. 使用ColorTranslator.FromHtml方法 string htmlColor = "#FF0000&q…

    C# 2023年6月7日
    00
  • 微信跳一跳自动脚本C#代码实现

    标题: 微信跳一跳自动脚本C#代码实现 介绍:本文主要讲解如何使用C#代码实现微信跳一跳自动脚本,可以自动完成跳跃并获得高分。 步骤:1. 准备工作:安装Visual Studio、Android手机模拟器及ADB驱动;2. 安装ADB驱动:将手机连接到电脑,安装对应的ADB驱动;3. 获取跳一跳的截屏:使用ADB命令获取手机屏幕截图; adb shell …

    C# 2023年6月6日
    00
  • HttpWebRequest出错.Section=ResponseHeader Detail=CR

    标题:解决 HttpWebRequest 出错 Section=ResponseHeader,Detail=CR 的攻略 可能出现的错误信息: 当使用 HttpWebRequest 请求 Web 服务器端数据时,有可能会出现 Section=ResponseHeader,Detail=CR 的错误提示,该错误提示可能是由于某些特殊字符在服务器端返回的响应中出…

    C# 2023年5月14日
    00
  • C#实现自定义Dictionary类实例

    这里是C#实现自定义Dictionary类实例的完整攻略: 1. 创建自定义Dictionary类 首先,我们需要创建一个自定义的Dictionary类,我们可以参考.NET Framework中原有的Dictionary类的实现方式,但是需要添加一些自定义的功能。下面是一个基本的实现方式: public class MyDictionary<TKey…

    C# 2023年6月6日
    00
  • C#条码生成及打印实例代码

    下面就为大家介绍一下“C#条码生成及打印实例代码”的完整攻略,包含以下几个步骤: 步骤1:了解条码生成原理 在了解具体的生成实现之前,我们需要先了解一下条码生成的基本原理和常用的编码方式。常用的编码方式包括Code39、Code128、EAN13等多种类型,每种类型的编码方式也不尽相同。 步骤2:引用条码生成库 在C#编程中,我们可以引用一些常用的条码生成库…

    C# 2023年5月31日
    00
  • 基于C#实现简单离线注册码生成与验证

    前言本篇攻略将介绍如何使用C#语言实现一个简单的离线注册码生成器与验证器,可适用于需要对软件进行授权的情形,如商业软件、企业内部软件等。首先我们将讲解注册码的生成方法,然后是注册码的验证方法,最后我们会给出完整的示例说明,希望这篇攻略对大家有所帮助。 一、注册码生成器的实现注册码生成器主要包括两个功能:生成唯一的机器码和根据机器码生成注册码。下面是代码实现:…

    C# 2023年6月6日
    00
  • 详解C#读取Appconfig中自定义的节点

    下面是详解C#读取Appconfig中自定义的节点的完整攻略。 一、准备工作 在开始之前,需要先在App.config配置文件中定义自定义节点。可以按照以下格式添加: <configuration> <configSections> <section name="customSection" type=&qu…

    C# 2023年5月15日
    00
合作推广
合作推广
分享本页
返回顶部