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日

相关文章

  • jquery 学习之一 对象访问

    下面是关于“jQuery学习之一对象访问”的完整攻略,包含两个示例。 1. jQuery对象访问简介 jQuery是一种流行的JavaScript库,用于简化JavaScript编程。jQuery提供了一组强大的API,用于访问和操作HTML元素、CSS样式和事件等。在jQuery中,可以使用选择器来选择HTML元素,并使用jQuery对象来访问和操作这些元…

    C# 2023年5月15日
    00
  • 让Visual Studio用上chatgpt

        最近小编思维发散“Visual Studio可以集成chatgpt吗?”,这样不就可以让chatgpt帮你写代码了吗?寻觅了一圈,还真有这个东西,那就是一个Visual Studio的扩展插件:Visual chatGPT Studio,虽然不是官方的,部分功能也可以值得一用。本文将介绍Visual chatGPT Studio及它的使用案例。 一、…

    C# 2023年5月4日
    00
  • Quartz.Net使用方法详解

    下面为你详细讲解使用Quartz.Net的完整攻略。 Quartz.Net使用方法详解 什么是Quartz.Net Quartz.Net是一个开源、轻量级、高效的作业调度框架,能够在指定的时间或间隔时间内自动触发指定的作业(Job),并可通过配置或编码实现作业的详细设定。 Quartz.Net主要特点: 轻量级、高效:核心代码不足7000行,占用资源较少; …

    C# 2023年5月31日
    00
  • Asp.NET 生成静态页面并分页的代码

    生成静态页面是提高网站性能、SEO优化的主流方法之一。而Asp.NET作为.NET平台的核心技术之一,也提供了生成静态页面的方法。下面将介绍如何在Asp.NET中生成静态页面并实现分页。 1. 生成静态页面的方法 在Asp.NET中,可以使用Response对象的Write方法将页面的HTML代码输出到文件。通过使用FileStream或StreamWrit…

    C# 2023年5月31日
    00
  • C#中is,as,using关键字的使用说明

    当使用C#编写程序时,is,as以及using是经常用到的关键字。下面将分别介绍它们的使用说明。 is is关键字用于判断一个对象是否是某个类或其派生类的实例。 示例1:判断一个对象是否是List类的实例。 List<int> list = new List<int>(); if (list is List<int>) {…

    C# 2023年5月15日
    00
  • C#调用存储过程详解(带返回值、参数输入输出等)

    介绍 在使用C#开发的过程中,经常需要调用存储过程来完成某些任务,比如从数据库中获取数据或者执行一些复杂的数据处理操作。本文将详细介绍C#调用存储过程的方法,包括如何传入参数、传递多个参数、以及如何获取存储过程的返回值。 调用带参数的存储过程 首先,我们需要连接到数据库。以使用SQL Server为例: using System.Data.SqlClient…

    C# 2023年5月15日
    00
  • asp.net代码中修改web.config节点的具体方法

    修改 ASP.NET 应用程序的 Web.config 文件中的节点,可以通过以下两种方式实现: 方式一:使用 Configuration 对象 首先,在代码中需要使用 System.Configuration 命名空间,然后利用 Configuration 类和 ConfigurationSection 类来访问和修改 Web.config 文件中的节点,…

    C# 2023年5月31日
    00
  • C#运行CGI程序实例

    下面是一份详细的C#运行CGI程序的完整攻略: 简介 CGI(Common Gateway Interface)是Web服务器与应用程序之间通信的一种标准接口。C#作为一种强大的编程语言,可以通过配置IIS来实现运行CGI程序。 配置IIS 首先,在IIS中添加CGI程序的支持。 打开IIS管理器,选择对应的网站,右击“属性”选项,进入“HTTP头”标签。 …

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