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#中多态性学习/虚方法/抽象方法和接口的用法

    详解C#中多态性学习 多态性 多态性是面向对象程序设计(OOP)的一个核心概念。在OOP中,多态性是指不同的类对相同的消息作出不同的响应。 多态性是OOP的三大基本特性之一,另外两个特性是封装和继承。它允许我们在一个类的层次结构中定义一个抽象类或接口,并让子类实现具体的行为。这种方法使代码更加灵活和可扩展。 虚方法 虚方法 (virtual method) …

    C# 2023年5月31日
    00
  • C#中math类的全部运算方法(总结)

    C#中Math类的全部运算方法(总结) Math类是C#中一个非常重要的数学计算类,它提供了丰富的方法来对数字进行各种数学运算,比如绝对值、三角函数、对数、幂等函数等等。在本篇文章中,我将对Math类的全部运算方法进行详细的总结和解释,方便大家快速了解和应用。 绝对值和抹零函数 Math.Abs()方法 Math.Abs()方法可以返回一个数的绝对值。简单来…

    C# 2023年6月7日
    00
  • C#如何优雅的对WinForm窗体应用程序进行权限控制

    C#中对WinForm窗体应用程序进行权限控制的优雅方法主要有以下几个步骤: 1. 创建用户登录界面 在用户打开程序时,首先需要提供一个登录窗口,将用户的账号和密码发送给服务器验证。可以使用WinForm中的TextBox、Label和Button等工具来创建这个窗口。 2. 向接口获取用户权限信息 用户登录成功后,需要将用户的身份信息发送给服务器来获取用户…

    C# 2023年5月31日
    00
  • C#内插字符串的简单使用

    C#内插字符串是一种方便的字符串构造方式,可以使用字符串插值(String interpolation)表达式 ${…} 显示地使用表达式计算值并将结果插入到字符串中。C# 6.0及以后版本支持内插字符串。 Step 1: 创建文本文件 首先需要创建一个C#代码文件(例如,使用Visual Studio或Visual Studio Code),并保存成 …

    C# 2023年6月7日
    00
  • C#中动态显示当前系统时间的实例方法

    下面我将为您详细讲解在C#中动态显示当前系统时间的实例方法的完整攻略。 步骤1:创建新的控制台应用程序 在Visual Studio中创建新的控制台应用程序,命名为“DynamicTime”。 步骤2:添加必要的命名空间 为了使用C#中的DateTime类,我们需要在程序中添加System命名空间。 using System; 步骤3:创建主方法 在Main…

    C# 2023年6月1日
    00
  • asp.net MVC分页代码分享

    关于“ASP.NET MVC分页代码分享”的攻略,我将从以下几个方面进行详细讲解: MVC分页原理简介 分页代码实现过程 示例说明 1. MVC分页原理简介 分页的目的是为了减少在一次性返回过多结果的情况下对服务器和数据库的压力,同时让用户更加方便的获取所需要的数据。MVC分页主要分为两个部分,分别是分页查询和分页显示。分页查询主要是通过参数指定需要返回的数…

    C# 2023年5月31日
    00
  • Unity Shader实现径向模糊效果

    Unity Shader实现径向模糊效果的攻略如下: 1. 准备工作 在开始实现模糊效果前,需要先准备好相应的工具和资源。具体步骤如下: 准备一个新的Shader文件,可以在Unity中创建一个新Shader文件,或者直接新建一个文本文件,将文件后缀名改为.shader。 在Shader文件中定义需要模糊的材质属性,如对象的颜色、纹理等。这些属性将被用来计算…

    C# 2023年6月3日
    00
  • 生成代码从T到T1、T2、Tn自动生成多个类型的泛型实例代码

    生成代码从 T 到 T1、T2、Tn 可以采用泛型实现,这要求在代码的编写中加入范型的参数和返回类型,并在程序运行时通过传入的不同类型参数自动生成多个类型的泛型实例代码。 具体实现步骤如下: 在代码中声明一个泛型方法,该方法中使用泛型参数 T 作为数据类型的占位符,以代表传入参数的类型。示例代码如下: public static <T> void…

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