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

yizhihongxing

一、概述

生产消费模式是一种常用的多线程编程模型,生产者不断向队列中添加任务,消费者从队列中取出任务进行处理。生产者和消费者在不同的线程中运行,通过队列实现线程之间的协作。在 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日

相关文章

  • Asp.net TreeView来构建用户选择输入的方法 推荐

    Asp.net TreeView来构建用户选择输入的方法,主要是通过构建TreeView控件来显示一个树形结构,以便用户可以通过勾选不同的节点来完成相应的选择。 下面是具体的实现步骤: 1. 创建TreeView控件 在Asp.net页面中,首先需要在WebForm中创建TreeView控件,在页面的标签内添加如下代码: <asp:TreeView I…

    C# 2023年5月31日
    00
  • C#使用SqlConnection连接到SQL Server的代码示例

    C#是一种流行的编程语言,广泛用于开发Windows应用程序和Web应用程序。在很多应用中,需要与SQL Server数据库进行交互。使用C#连接SQL Server的主流方式是使用SqlConnection对象。以下是连接到SQL Server的代码示例。 创建SqlConnection对象 要连接到SQL Server,首先需要创建SqlConnecti…

    C# 2023年6月1日
    00
  • Node.js实现Excel转JSON

    下面是“Node.js实现Excel转JSON”的完整攻略。 一、安装依赖模块 在开始使用Node.js进行Excel转JSON之前,需要安装一些必要的模块。打开命令行工具,输入以下命令: npm install xlsx 这将会安装一个名为xlsx的模块,该模块可以让Node.js读取和写入Excel文件。 二、实现Excel转JSON Step 1:读取…

    C# 2023年6月1日
    00
  • 在C#中global关键字的作用及其用法

    在C#中global关键字的作用及其用法 在C#中,global关键字可以用来指示某个标识符是全局的,从而可以在任何地方都可以访问到。 用法一:全局命名空间 在C#中,全局命名空间是由所有不属于其他命名空间的类型、函数和变量组成的空间。可以使用global关键字来引用全局命名空间中的类型或变量,例如: global::System.Console.Write…

    C# 2023年5月15日
    00
  • C#防SQL注入代码的三种方法

    下面是针对C#防SQL注入的三种方法的详细讲解攻略。 一、使用参数化查询 参数化查询通过将输入参数作为参数传递给查询来避免SQL注入攻击。这样可以将输入值作为字符串传递,而不是将字符串值作为查询的一部分来编写查询语句。 using (SqlConnection connection = new SqlConnection(connectionString))…

    C# 2023年6月7日
    00
  • C#将dll打包到程序中的具体实现

    将dll打包到C#程序中是一个常见的需求,主要有以下两种实现方式: 1. 通过嵌入资源的方式实现将dll打包到程序中 通过嵌入资源的方式可以将dll文件以二进制形式存储在程序中,然后在运行时将其提取出来,再进行使用。具体实现步骤如下: 步骤一:将dll文件添加到项目中 在Visual Studio中,右键点击项目,选择”添加”-“现有项”,然后选择要添加的d…

    C# 2023年5月15日
    00
  • WinForm中变Enter键为Tab键实现焦点转移的方法

    在WinForm程序中,我们常常需要通过键盘快速切换输入框焦点,Enter键和Tab键都是常见的选项,不过默认情况下,Enter键是用来确定输入的,Tab键是用来作为焦点转移的快捷键。如果我们需要调换这两个按键的功能,我们可以进行如下设置。 方法一:使用Input Key预处理消息 在WinForm中,每个控件都有一个ProcessCmdKey方法,该方法可…

    C# 2023年6月7日
    00
  • C#加密算法汇总(推荐)

    C#加密算法汇总(推荐) 简介 本文主要介绍C#语言中常用的加密算法。涉及到的加密算法包括对称加密算法和非对称加密算法。对称加密算法包括DES、AES、RC4等,其中DES和AES已经成为最经典的对称加密算法,RC4算法常被用于数据流加密。非对称加密算法包括RSA和DSA等,其中RSA算法用于数字签名,DSA算法用于数字证书。 DES加密算法 DES加密算法…

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