最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET?中?Channel?類簡單使用方法

 更新時(shí)間:2024年05月20日 08:58:53   作者:敏杰的學(xué)習(xí)園地  
Channel?類是?.NET?CORE?3.0?后新加入的類,為我們提供了便利的生產(chǎn)者/消費(fèi)者模式實(shí)現(xiàn)方案,相當(dāng)于是一個(gè)進(jìn)程內(nèi)的內(nèi)存隊(duì)列,而且它沒有持久化,純內(nèi)存操作,性能是非常非常高的,這篇文章主要介紹了.NET?中?Channel?類簡單使用,需要的朋友可以參考下

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。用中文說的話就是這個(gè)類提供了在生產(chǎn)者跟消費(fèi)者之間異步傳統(tǒng)數(shù)據(jù)的能力,簡單來說可以認(rèn)為是一個(gè)內(nèi)存消息隊(duì)列。

示例 1

下面是一個(gè)簡單的示例,說明如何使用 Channel 類來創(chuàng)建一個(gè)生產(chǎn)者-消費(fèi)者模型:

    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); // 模擬生產(chǎn)者需要一些時(shí)間來生成數(shù)據(jù)
            }
            channel.Writer.Complete();
        });
        var consumer = Task.Run(async () =>
        {
            await foreach (var item in channel.Reader.ReadAllAsync())
            {
                Console.WriteLine($"消費(fèi)者接收到: {item}");
            }
        });
        await Task.WhenAll(producer, consumer);
    }

在這個(gè)例子中,我們創(chuàng)建了一個(gè)無界的通道,然后創(chuàng)建了兩個(gè)任務(wù),一個(gè)是生產(chǎn)者,一個(gè)是消費(fèi)者。生產(chǎn)者每秒生成一個(gè)數(shù)字,然后寫入通道。消費(fèi)者從通道中讀取數(shù)據(jù)并打印出來。當(dāng)生產(chǎn)者完成寫入后,它會(huì)調(diào)用 channel.Writer.Complete() 來通知消費(fèi)者沒有更多的數(shù)據(jù)可以讀取。

示例 2

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

    static async Task Main(string[] args)
    {
        var channel = Channel.CreateBounded<int>(5); // 創(chuàng)建一個(gè)容量為5的有界通道
        var producer = Task.Run(async () =>
        {
            for (int i = 0; i < 10; i++)
            {
                await channel.Writer.WriteAsync(i);
                Console.WriteLine($"生產(chǎn)者生成了: {i}");
                await Task.Delay(1000); // 模擬生產(chǎn)者需要一些時(shí)間來生成數(shù)據(jù)
            }
            channel.Writer.Complete();
        });
        var consumer = Task.Run(async () =>
        {
            await foreach (var item in channel.Reader.ReadAllAsync())
            {
                Console.WriteLine($"消費(fèi)者接收到: {item}");
                await Task.Delay(2000); // 模擬消費(fèi)者需要一些時(shí)間來處理數(shù)據(jù)
            }
        });
        await Task.WhenAll(producer, consumer);
    }

在這個(gè)例子中,我們創(chuàng)建了一個(gè)容量為5的有界通道。生產(chǎn)者每秒生成一個(gè)數(shù)字,然后寫入通道。消費(fèi)者從通道中讀取數(shù)據(jù)并打印出來,但消費(fèi)者處理數(shù)據(jù)的速度比生產(chǎn)者慢,所以當(dāng)通道滿時(shí),生產(chǎn)者的 WriteAsync 操作將會(huì)阻塞,直到消費(fèi)者讀取了一些數(shù)據(jù),使得通道有空間可用。

示例 3

下面是一個(gè)示例,展示了如何在多個(gè)生產(chǎn)者和消費(fèi)者之間共享一個(gè)通道:

    static async Task Main(string[] args)
    {
        var channel = Channel.CreateUnbounded<int>();
        // 創(chuàng)建兩個(gè)生產(chǎn)者
        var producer1 = Produce(channel.Writer, id: 1);
        var producer2 = Produce(channel.Writer, id: 2);
        // 創(chuàng)建兩個(gè)消費(fèi)者
        var consumer1 = Consume(channel.Reader, id: 1);
        var consumer2 = Consume(channel.Reader, id: 2);
        // 等待所有生產(chǎn)者和消費(fèi)者完成
        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($"生產(chǎn)者{id}生成了: {i}");
            await Task.Delay(1000); // 模擬生產(chǎn)者需要一些時(shí)間來生成數(shù)據(jù)
        }
        writer.Complete();
    }
    static async Task Consume(ChannelReader<int> reader, int id)
    {
        await foreach (var item in reader.ReadAllAsync())
        {
            Console.WriteLine($"消費(fèi)者{id}接收到: {item}");
            await Task.Delay(2000); // 模擬消費(fèi)者需要一些時(shí)間來處理數(shù)據(jù)
        }
    }

在這個(gè)例子中,我們創(chuàng)建了兩個(gè)生產(chǎn)者和兩個(gè)消費(fèi)者,它們都共享同一個(gè)通道。這是一個(gè)非常重要使用模式。因?yàn)楫?dāng)我們使用消息隊(duì)列的時(shí)候往往會(huì)有多個(gè)生產(chǎn)者跟多個(gè)消費(fèi)者。我們可以通過控制生產(chǎn)者生產(chǎn)的速度來控制推入隊(duì)列的數(shù)據(jù)量。我們還可以通過控制消費(fèi)者的數(shù)量來控制消費(fèi)數(shù)據(jù)的速度,從而來調(diào)節(jié)系統(tǒng)的流量,達(dá)到消峰填谷的作用。

總結(jié)

Channel 類是 .NET CORE 3.0 后新加入的類。為我們提供了便利的生產(chǎn)者/消費(fèi)者模式實(shí)現(xiàn)方案。相當(dāng)于是一個(gè)進(jìn)程內(nèi)的內(nèi)存隊(duì)列,而且它沒有持久化,純內(nèi)存操作,性能是非常非常高的。當(dāng)我們面對(duì)真正的高并發(fā)的時(shí)候可以為我們的系統(tǒng)提供吞吐量。當(dāng)然代價(jià)是內(nèi)存跟放棄一些實(shí)時(shí)性。

到此這篇關(guān)于.NET 中 Channel 類簡單使用的文章就介紹到這了,更多相關(guān).NET  Channel 類使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • .Net中的弱引用字典WeakDictionary和ConditionalWeakTable介紹

    .Net中的弱引用字典WeakDictionary和ConditionalWeakTable介紹

    這篇文章介紹了.Net中的弱引用字典WeakDictionary和ConditionalWeakTable,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • updatepanel用法之triggers使用示例

    updatepanel用法之triggers使用示例

    triggers有的兩種觸發(fā)器asyncpostbacktrigger和postbacktrigger,下面是使用示例,需要的朋友可以參考下
    2014-03-03
  • Entity?Framework使用配置伙伴創(chuàng)建數(shù)據(jù)庫

    Entity?Framework使用配置伙伴創(chuàng)建數(shù)據(jù)庫

    這篇文章介紹了Entity?Framework使用配置伙伴創(chuàng)建數(shù)據(jù)庫的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • asp.net Menu控件+SQLServer實(shí)現(xiàn)動(dòng)態(tài)多級(jí)菜單

    asp.net Menu控件+SQLServer實(shí)現(xiàn)動(dòng)態(tài)多級(jí)菜單

    asp.net Menu控件+SQLServer實(shí)現(xiàn)動(dòng)態(tài)多級(jí)菜單的代碼,需要的朋友可以參考下。
    2011-12-12
  • asp.net 頁面中添加普通視頻的幾種方式介紹

    asp.net 頁面中添加普通視頻的幾種方式介紹

    一是通過調(diào)用window media player進(jìn)行播放,二是通過調(diào)用replayer進(jìn)行播放,三是通過調(diào)用flashplayer進(jìn)行播放
    2014-08-08
  • Asp.Net Core使用swagger生成api文檔的完整步驟

    Asp.Net Core使用swagger生成api文檔的完整步驟

    這篇文章主要給大家介紹了關(guān)于Asp.Net Core使用swagger生成api文檔的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Asp.Net Core具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-12-12
  • IE10下Gridview后臺(tái)設(shè)置行高不起作用解決方法

    IE10下Gridview后臺(tái)設(shè)置行高不起作用解決方法

    GridView1.HeaderStyle.Height=17發(fā)現(xiàn)在IE10 中不起作用,經(jīng)過反復(fù)測試修改為e.Row.Cells[0].Height=17即可解決問題,有類似問題的朋友可以參考下哈
    2013-04-04
  • .NET Core3.0 日志 logging的實(shí)現(xiàn)

    .NET Core3.0 日志 logging的實(shí)現(xiàn)

    這篇文章主要介紹了.NET Core3.0 日志 logging的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-10-10
  • 在 .NET Core 中使用 Diagnostics (Diagnostic Source) 記錄跟蹤信息

    在 .NET Core 中使用 Diagnostics (Diagnostic Source) 記錄跟蹤信息

    今天給大家講一下在 .NET Core 2 中引入的全新 DiagnosticSource 事件機(jī)制,為什么說是全新呢? 在以前的 .NET Framework 有心的同學(xué)應(yīng)該知道也有 Diagnostics,那么新的 .NET Core 中有什么變化呢?跟隨小編一起看看吧
    2021-06-06
  • ASP.NET用戶控件如何使用

    ASP.NET用戶控件如何使用

    這篇文章主要介紹了ASP.NET用戶控件的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2015-09-09

最新評(píng)論

依兰县| 佳木斯市| 子洲县| 利津县| 西藏| 浏阳市| 隆林| 日照市| 蒲城县| 西安市| 平乐县| 宝应县| 元氏县| 资阳市| 江永县| 广灵县| 景谷| 汶川县| 文安县| 榆林市| 顺昌县| 延庆县| 云梦县| 彭阳县| 明光市| 东乡族自治县| 永兴县| 土默特左旗| 台中市| 江安县| 军事| 民县| 塔城市| 淳安县| 九龙坡区| 自治县| 阿拉善右旗| 阿城市| 武平县| 方城县| 新邵县|