溫馨提示×

c# blockingcollection怎樣實現異步操作

c#
小樊
105
2024-11-21 05:43:11
欄目: 編程語言

在C#中,BlockingCollection 是一個線程安全的集合,可以在多個線程之間安全地傳遞數據。要實現異步操作,可以使用 Taskasync/await 關鍵字。以下是一個簡單的示例,展示了如何使用 BlockingCollection 實現異步操作:

首先,創建一個 BlockingCollection 實例:

BlockingCollection<int> collection = new BlockingCollection<int>();

然后,創建一個生產者方法,將數據添加到 BlockingCollection 中。這個方法將使用 Task.Run 來實現異步操作:

public static Task ProduceAsync(BlockingCollection<int> collection, int maxItems)
{
    for (int i = 0; i < maxItems; i++)
    {
        // 將數據添加到集合中,如果集合已滿,則等待直到有空間可用
        collection.Add(i, CancellationToken.None);
    }

    return Task.CompletedTask;
}

接下來,創建一個消費者方法,從 BlockingCollection 中獲取數據。這個方法也將使用 Task.Runasync/await 關鍵字來實現異步操作:

public static async Task ConsumeAsync(BlockingCollection<int> collection)
{
    while (true)
    {
        // 從集合中獲取數據,如果集合為空,則等待直到有數據可用
        int item = await collection.TakeAsync(CancellationToken.None);

        // 處理數據(例如,打印到控制臺)
        Console.WriteLine($"Consumed: {item}");
    }
}

最后,在主程序中啟動生產者和消費者任務:

static async Task Main(string[] args)
{
    BlockingCollection<int> collection = new BlockingCollection<int>();

    // 創建并啟動生產者任務
    Task producerTask = Task.Run(() => ProduceAsync(collection, 10));

    // 創建并啟動消費者任務
    Task consumerTask = ConsumeAsync(collection);

    // 等待生產者和消費者任務完成
    await Task.WhenAll(producerTask, consumerTask);
}

這個示例展示了如何使用 BlockingCollection、Taskasync/await 關鍵字實現異步操作。生產者任務將數據添加到集合中,而消費者任務將從集合中獲取數據并處理。這兩個任務將并行運行,直到所有數據都被處理完畢。

0
亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女