91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

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
定安县| 海淀区| 佳木斯市| 盈江县| 易门县| 开阳县| 肇东市| 新和县| 谷城县| 维西| 肥西县| 黄平县| 铁岭市| 巧家县| 彭阳县| 邯郸县| 宜春市| 济阳县| 武宣县| 汝南县| 盐津县| 晴隆县| 双流县| 吉水县| 莱阳市| 宁安市| 托克托县| 海原县| 仪陇县| 西峡县| 商水县| 石景山区| 师宗县| 黔西| 赤壁市| 沙雅县| 长岛县| 纳雍县| 繁峙县| 巩义市| 湖南省|