亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

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
扬州市| 长垣县| 九江县| 夏河县| 辛集市| 秦皇岛市| 大名县| 酒泉市| 鹤峰县| 连南| 怀宁县| 乌拉特中旗| 宁远县| 巴塘县| 务川| 深州市| 土默特左旗| 汉源县| 黄大仙区| 浙江省| 北碚区| 中山市| 东乡族自治县| 济阳县| 长沙县| 盘锦市| SHOW| 法库县| 牟定县| 青海省| 西林县| 临沂市| 前郭尔| 舒城县| 枣强县| 溆浦县| 宁晋县| 沂南县| 芷江| 佛学| 绥芬河市|