BlockingCollection的基础使用

本文详细介绍了如何在C#中使用BlockingCollection实现线程安全的生产者-消费者模型,展示了如何创建阻塞队列进行消息传递和同步处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BlockingCollection的基础使用

BlockingCollection就是一个线程安全的阻塞队列,利用阻塞这个特性,我们可以实现进程内的生产者-消费者模式,比如消息转发、日志记录等。

using System;
using System.Collections.Concurrent;
using System.Threading;

public class Program
{
    static BlockingCollection<int> queue = new BlockingCollection<int>(boundedCapacity: 5);

    static void Producer()
    {
        for (int i = 1; i <= 10; i++)
        {
            Console.WriteLine($"生产者:生产消息 {i}");
            queue.Add(i);
            Thread.Sleep(100); // 模拟生产过程
        }
        queue.CompleteAdding();
    }

    static void Consumer()
    {
        foreach (var item in queue.GetConsumingEnumerable())
        {
            Console.WriteLine($"消费者:消费消息 {item}");
            Thread.Sleep(200); // 模拟消费过程
        }
    }

    static void Main()
    {
        var producerThread = new Thread(Producer);
        var consumerThread = new Thread(Consumer);

        producerThread.Start();
        consumerThread.Start();

        producerThread.Join();
        consumerThread.Join();

        Console.WriteLine("程序执行完毕。");
    }
}


using System.Collections.Generic;
using System.Threading;

public class CustomBlockingQueue<T>
{
    private Queue<T> queue = new Queue<T>();
    private object lockObj = new object();

    public void Enqueue(T item)
    {
        lock (lockObj)
        {
            queue.Enqueue(item);
            Monitor.Pulse(lockObj); // 唤醒等待的线程
        }
    }

    public T Dequeue()
    {
        lock (lockObj)
        {
            while (queue.Count == 0)
                Monitor.Wait(lockObj); // 等待直到队列非空

            return queue.Dequeue();
        }
    }
}

public class Program
{
    static CustomBlockingQueue<int> queue = new CustomBlockingQueue<int>();

    static void Producer()
    {
        for (int i = 1; i <= 10; i++)
        {
            Console.WriteLine($"生产者:生产消息 {i}");
            queue.Enqueue(i);
            Thread.Sleep(100); // 模拟生产过程
        }
    }

    static void Consumer()
    {
        for (int i = 1; i <= 10; i++)
        {
            var item = queue.Dequeue();
            Console.WriteLine($"消费者:消费消息 {item}");
            Thread.Sleep(200); // 模拟消费过程
        }
    }

    static void Main()
    {
        var producerThread = new Thread(Producer);
        var consumerThread = new Thread(Consumer);

        producerThread.Start();
        consumerThread.Start();

        producerThread.Join();
        consumerThread.Join();

        Console.WriteLine("程序执行完毕。");
    }
}


参考文献:https://www.jb51.net/article/276666.htm、

https://blog.csdn.net/weixin_48588665/article/details/132124842

https://www.cnblogs.com/Insist-Y/p/17407413.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值