公交车上荫蒂添的好舒服的电影-公用玩物(np双xing总受)-公用小荡货芊芊-公与妇仑乱hd-攻把受做哭边走边肉楼梯play-古装一级淫片a免费播放口

LOGO OA教程 ERP教程 模切知識交流 PMS教程 CRM教程 開發文檔 其他文檔  
 
網站管理員

.NET 中 Channel 類簡單使用

freeflydom
2024年5月27日 8:46 本文熱度 1374

Channel 是干什么的#

The System.Threading.Channels namespace provides a set of synchronization data structures for passing data between producers and consumers asynchronously. The library targets .NET Standard and works on all .NET implementations.
Channels are an implementation of the producer/consumer conceptual programming model.
以上是微軟官方的解釋 channels。用中文說的話就是這個類提供了在生產者跟消費者之間異步傳統數據的能力,簡單來說可以認為是一個內存消息隊列。

示例 1#

下面是一個簡單的示例,說明如何使用 Channel 類來創建一個生產者-消費者模型:

    static async Task Main(string[] args)

    {

        var channel = Channel.CreateUnbounded<int>();


        var producer = Task.Run(async () =>

        {

            for (int i = 0; i < 10; i++)

            {

                await channel.Writer.WriteAsync(i);

                await Task.Delay(1000); // 模擬生產者需要一些時間來生成數據

            }


            channel.Writer.Complete();

        });


        var consumer = Task.Run(async () =>

        {

            await foreach (var item in channel.Reader.ReadAllAsync())

            {

                Console.WriteLine($"消費者接收到: {item}");

            }

        });


        await Task.WhenAll(producer, consumer);

    }


在這個例子中,我們創建了一個無界的通道,然后創建了兩個任務,一個是生產者,一個是消費者。生產者每秒生成一個數字,然后寫入通道。消費者從通道中讀取數據并打印出來。當生產者完成寫入后,它會調用 channel.Writer.Complete() 來通知消費者沒有更多的數據可以讀取。

示例 2#

你可以使用 Channel.CreateBounded(capacity) 方法來創建一個有界的通道,其中 capacity 參數指定了通道的容量。當通道滿時,嘗試寫入的操作將會阻塞,直到有空間可用。

    static async Task Main(string[] args)

    {

        var channel = Channel.CreateBounded<int>(5); // 創建一個容量為5的有界通道


        var producer = Task.Run(async () =>

        {

            for (int i = 0; i < 10; i++)

            {

                await channel.Writer.WriteAsync(i);

                Console.WriteLine($"生產者生成了: {i}");

                await Task.Delay(1000); // 模擬生產者需要一些時間來生成數據

            }


            channel.Writer.Complete();

        });


        var consumer = Task.Run(async () =>

        {

            await foreach (var item in channel.Reader.ReadAllAsync())

            {

                Console.WriteLine($"消費者接收到: {item}");

                await Task.Delay(2000); // 模擬消費者需要一些時間來處理數據

            }

        });


        await Task.WhenAll(producer, consumer);

    }


在這個例子中,我們創建了一個容量為5的有界通道。生產者每秒生成一個數字,然后寫入通道。消費者從通道中讀取數據并打印出來,但消費者處理數據的速度比生產者慢,所以當通道滿時,生產者的 WriteAsync 操作將會阻塞,直到消費者讀取了一些數據,使得通道有空間可用。

示例 3#

下面是一個示例,展示了如何在多個生產者和消費者之間共享一個通道:

    static async Task Main(string[] args)

    {

        var channel = Channel.CreateUnbounded<int>();


        // 創建兩個生產者

        var producer1 = Produce(channel.Writer, id: 1);

        var producer2 = Produce(channel.Writer, id: 2);


        // 創建兩個消費者

        var consumer1 = Consume(channel.Reader, id: 1);

        var consumer2 = Consume(channel.Reader, id: 2);


        // 等待所有生產者和消費者完成

        await Task.WhenAll(producer1, producer2, consumer1, consumer2);

    }


    static async Task Produce(ChannelWriter<int> writer, int id)

    {

        for (int i = 0; i < 10; i++)

        {

            await writer.WriteAsync(i);

            Console.WriteLine($"生產者{id}生成了: {i}");

            await Task.Delay(1000); // 模擬生產者需要一些時間來生成數據

        }


        writer.Complete();

    }


    static async Task Consume(ChannelReader<int> reader, int id)

    {

        await foreach (var item in reader.ReadAllAsync())

        {

            Console.WriteLine($"消費者{id}接收到: {item}");

            await Task.Delay(2000); // 模擬消費者需要一些時間來處理數據

        }

    }

在這個例子中,我們創建了兩個生產者和兩個消費者,它們都共享同一個通道。這是一個非常重要使用模式。因為當我們使用消息隊列的時候往往會有多個生產者跟多個消費者。我們可以通過控制生產者生產的速度來控制推入隊列的數據量。我們還可以通過控制消費者的數量來控制消費數據的速度,從而來調節系統的流量,達到消峰填谷的作用。

總結#

Channel 類是 .NET CORE 3.0 后新加入的類。為我們提供了便利的生產者/消費者模式實現方案。相當于是一個進程內的內存隊列,而且它沒有持久化,純內存操作,性能是非常非常高的。當我們面對真正的高并發的時候可以為我們的系統提供吞吐量。當然代價是內存跟放棄一些實時性。


作者:Agile.Zhou

出處:https://www.cnblogs.com/kklldog/p/18201013/channel-in-net

版權:本作品采用「署名-非商業性使用-相同方式共享 4.0 國際」許可協議進行許可。



該文章在 2024/5/27 8:50:42 編輯過
關鍵字查詢
相關文章
正在查詢...
點晴ERP是一款針對中小制造業的專業生產管理軟件系統,系統成熟度和易用性得到了國內大量中小企業的青睞。
點晴PMS碼頭管理系統主要針對港口碼頭集裝箱與散貨日常運作、調度、堆場、車隊、財務費用、相關報表等業務管理,結合碼頭的業務特點,圍繞調度、堆場作業而開發的。集技術的先進性、管理的有效性于一體,是物流碼頭及其他港口類企業的高效ERP管理信息系統。
點晴WMS倉儲管理系統提供了貨物產品管理,銷售管理,采購管理,倉儲管理,倉庫管理,保質期管理,貨位管理,庫位管理,生產管理,WMS管理系統,標簽打印,條形碼,二維碼管理,批號管理軟件。
點晴免費OA是一款軟件和通用服務都免費,不限功能、不限時間、不限用戶的免費OA協同辦公管理系統。
Copyright 2010-2025 ClickSun All Rights Reserved

主站蜘蛛池模板: 国产精品白丝av嫩草影院 | 国产高清在线 | 国产精品果冻传媒呆梦梦 | 国产成人精品久久二区二区 | 国产精品免费无遮挡永久视频 | 国产日韩久久久一区二区三区 | 国产国产成年年人免费看片 | av每日更新 | 国产精品无码制服丝袜网站 | 国产成人高清在线观看 | 国产美女露脸一级毛片 | 国精产品一品二品国精品69x | 91国自产精品一区二区三区 | 精品国产av无码久久久 | 国产激情一区二区三区四区 | 成人无码动漫在线观看 | 2025国产麻豆剧传媒精品网站 | 国产成人亚洲精品无码青青草原 | 国产av无码专区亚洲精品网站 | 18禁午夜成人影院在线看 | 高潮一区二区三区视频在线观看 | 丰满年轻岳欲乱中文字幕电影 | 国产美女裸体露胸网站 | 国产91电影厂精品福利片 | 高清精品自在久久国产 | 国产一区二三 | 91久久综合天天婷婷 | 成a人影片免费观看日本 | 精品美女一级一区二区三 | 二区秒播| 福利国产小视频 | 成人爱av在线播放 | 国产成人欧美日韩在线电影 | 国产精品青青草原免费无码 | 精品无人区乱码一区二区三区手机 | 国产熟女高潮精品视频av | 高清无码在线网站 | 97午夜理论片影 | 国产女网红亚洲精品 | 国产成人高清在线观看 | 国产精品秘 |