c#

c# blockingcollection如何实现线程安全

小樊
84
2024-11-21 05:36:10
栏目: 编程语言

BlockingCollection 是 .NET 集合框架中提供的一个线程安全的集合类,它可以用于在多线程环境下存储和传递数据。它提供了 AddTakeTryTake 等方法,这些方法都是线程安全的。下面是一个简单的示例,展示了如何使用 BlockingCollection 实现线程安全的数据传递:

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

class Program
{
    static BlockingCollection<int> _blockingCollection = new BlockingCollection<int>();

    static void Producer()
    {
        for (int i = 0; i < 10; i++)
        {
            _blockingCollection.Add(i);
            Console.WriteLine($"Produced: {i}");
            Thread.Sleep(1000); // 模拟生产数据所需的时间
        }

        // 生产完成后,通知消费者
        _blockingCollection.CompleteAdding();
    }

    static void Consumer()
    {
        foreach (var item in _blockingCollection.GetConsumingEnumerable())
        {
            Console.WriteLine($"Consumed: {item}");
            Thread.Sleep(2000); // 模拟消费数据所需的时间
        }
    }

    static void Main(string[] args)
    {
        Thread producerThread = new Thread(Producer);
        Thread consumerThread = new Thread(Consumer);

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

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

在这个示例中,我们创建了一个 BlockingCollection<int> 实例,并启动了两个线程:一个生产者线程和一个消费者线程。生产者线程将数据添加到集合中,而消费者线程从集合中获取数据。BlockingCollectionAddGetConsumingEnumerable 方法都是线程安全的,因此我们不需要额外的同步措施。

注意,当生产者线程完成数据添加后,需要调用 CompleteAdding 方法通知消费者线程不再有新的数据添加。这样,消费者线程在遍历集合时就不会一直等待新数据。

0
看了该问题的人还看了