首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C#中实现生产者/消费者模式

在C#中,生产者/消费者模式是一种常见的多线程设计模式,它可以帮助我们在多线程环境下安全地共享数据。在这种模式下,生产者负责生成数据并将其放入缓冲区,消费者则从缓冲区中获取数据并处理它。以下是一个简单的C#实现生产者/消费者模式的示例:

代码语言:csharp
复制
using System;
using System.Collections.Generic;
using System.Threading;

class Program
{
    static void Main()
    {
        // 创建一个缓冲区,用于存储数据
        Buffer buffer = new Buffer(10);

        // 创建生产者线程
        Thread producerThread = new Thread(() =>
        {
            for (int i = 0; i < 20; i++)
            {
                buffer.Add(i);
                Console.WriteLine($"Produced: {i}");
                Thread.Sleep(100);
            }
        });

        // 创建消费者线程
        Thread consumerThread = new Thread(() =>
        {
            for (int i = 0; i < 20; i++)
            {
                int data = buffer.Get();
                Console.WriteLine($"Consumed: {data}");
                Thread.Sleep(150);
            }
        });

        // 启动生产者和消费者线程
        producerThread.Start();
        consumerThread.Start();

        // 等待线程结束
        producerThread.Join();
        consumerThread.Join();
    }
}

class Buffer
{
    private readonly object _lock = new object();
    private readonly Queue<int> _queue;
    private readonly int _size;

    public Buffer(int size)
    {
        _size = size;
        _queue = new Queue<int>(size);
    }

    public void Add(int data)
    {
        lock (_lock)
        {
            while (_queue.Count >= _size)
            {
                Monitor.Wait(_lock);
            }

            _queue.Enqueue(data);
            Monitor.Pulse(_lock);
        }
    }

    public int Get()
    {
        lock (_lock)
        {
            while (_queue.Count == 0)
            {
                Monitor.Wait(_lock);
            }

            int data = _queue.Dequeue();
            Monitor.Pulse(_lock);
            return data;
        }
    }
}

在这个示例中,我们创建了一个缓冲区类Buffer,它使用了一个队列来存储数据,并使用了Monitor类来实现线程同步。生产者线程不断向缓冲区中添加数据,消费者线程则不断从缓冲区中获取数据并处理它。

这个示例展示了一个简单的生产者/消费者模式,实际应用中可能需要更复杂的实现,例如支持多个生产者和多个消费者,或者支持不同类型的数据。在实际应用中,我们可以使用.NET框架中提供的并行处理库System.Threading.Tasks.Dataflow来实现更高效的生产者/消费者模式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券