中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

c# blockingcollection如何處理阻塞操作

c#
小樊
81
2024-11-21 05:40:10
欄目: 編程語言

BlockingCollection 是 .NET 集合框架中的一個類,它提供了一種線程安全的集合,可以用于在生產者和消費者線程之間傳遞數據。它可以處理阻塞操作,以確保在生產者向集合中添加元素時,消費者不會在集合為空時嘗試獲取元素,反之亦然。

以下是使用 BlockingCollection 處理阻塞操作的一個簡單示例:

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

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

    static void Main(string[] args)
    {
        // 創建一個生產者線程
        Thread producerThread = new Thread(() =>
        {
            for (int i = 0; i < 10; i++)
            {
                Console.WriteLine($"生產者生產了: {i}");
                _blockingCollection.Add(i);
                Thread.Sleep(1000); // 模擬生產過程耗時
            }
            _blockingCollection.CompleteAdding(); // 通知消費者不再有新的元素添加
        });

        // 創建一個消費者線程
        Thread consumerThread = new Thread(() =>
        {
            while (!_blockingCollection.IsCompleted) // 當集合未完成時,繼續循環
            {
                int item = _blockingCollection.Take(); // 從集合中獲取元素,如果集合為空,則阻塞線程
                Console.WriteLine($"消費者消費了: {item}");
                Thread.Sleep(2000); // 模擬消費過程耗時
            }
        });

        // 啟動生產者和消費者線程
        producerThread.Start();
        consumerThread.Start();

        // 等待線程執行完成
        producerThread.Join();
        consumerThread.Join();

        Console.WriteLine("所有操作已完成");
    }
}

在這個示例中,我們創建了一個 BlockingCollection<int> 實例,用于在生產者和消費者線程之間傳遞整數。生產者線程向集合中添加元素,消費者線程從集合中獲取元素。當集合為空時,消費者線程會被阻塞,直到生產者線程向集合中添加新元素。同樣,當集合中的所有元素都被消費完畢時,生產者線程會被阻塞,直到消費者線程從集合中獲取元素。

BlockingCollection 還提供了其他方法,如 TryAdd()TryTake(),它們在無法添加或獲取元素時會立即返回,而不是阻塞線程。這可以在某些情況下提供更好的性能。

0
吉林省| 曲阳县| 保德县| 中牟县| 江陵县| 蓝山县| 阿坝县| 望谟县| 新野县| 古交市| 新源县| 潢川县| 锡林郭勒盟| 郓城县| 科技| 绵阳市| 三河市| 凌云县| 澎湖县| 咸宁市| 景泰县| 扶绥县| 太保市| 吕梁市| 新郑市| 文登市| 南涧| 金秀| 出国| 思茅市| 叶城县| 千阳县| 禄丰县| 灵山县| 建宁县| 长兴县| 杭锦旗| 定安县| 吉林省| 吉隆县| 武川县|