C# Channel

  • 核心概念
  • 創建Channel
    • 無界通道
    • 有界通道
      • `FullMode`選項
  • 生產者-消費者模式
    • 生產者寫入數據
    • 消費者讀取數據
  • 完整示例
  • 高級配置
    • 優化選項:
    • 取消操作:通過 `CancellationToken` 取消讀寫。
  • 錯誤處理
  • 適用場景
  • `Channel`的類型
  • 創建`Channel`
  • 寫入和讀取消息
  • 使用場景
  • 示例代碼
  • 注意事項

C#中, System.Threading.Channels 提供了 高效的異步生產-消費模型,適用于多任務間的數據傳遞。以下是其核心概念及使用方法的總結:

核心概念

Channel<T>:異步消息隊列,支持多生產者和多消費者。

ChannelWriter<T>:用于異步寫入數據(WriteAsync),完成后需調用 Complete()

ChannelReader<T>:用于異步讀取數據,支持 ReadAsyncReadAllAsync 遍歷。

創建Channel

無界通道

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

容量無限,適用于不確定數據量的場景。

有界通道

var options = new BoundedChannelOptions(10)
{FullMode = BoundedChannelFullMode.Wait // 滿時等待
};
var channel = Channel.CreateBounded<int>(options);

FullMode選項

  • Wait(默認):寫入時阻塞直到有空間。

  • DropOldest/DropNewest:丟棄最舊/最新數據。

  • DropWrite:丟棄當前寫入的數據。

生產者-消費者模式

生產者寫入數據

async Task Producer(ChannelWriter<int> writer)
{for (int i = 0; i < 10; i++){await writer.WriteAsync(i);await Task.Delay(100);}writer.Complete(); // 標記完成
}

消費者讀取數據

async Task Consumer(ChannelReader<int> reader)
{// 方式1: ReadAllAsync遍歷await foreach (var item in reader.ReadAllAsync()){Console.WriteLine($"Received: {item}");}// 方式2: 手動循環while (await reader.WaitToReadAsync()){while (reader.TryRead(out var item)){Console.WriteLine($"Received: {item}");}}
}

完整示例

using System;
using System.Threading.Channels;
using System.Threading.Tasks;class Program
{static async Task Main(){var channel = Channel.CreateUnbounded<int>();var producer = Producer(channel.Writer);var consumer = Consumer(channel.Reader);await Task.WhenAll(producer, consumer);}static async Task Producer(ChannelWriter<int> writer){try{for (int i = 0; i < 10; i++){await writer.WriteAsync(i);await Task.Delay(100);}}catch (Exception ex){writer.Complete(ex); // 傳遞異常}finally{writer.Complete();}}static async Task Consumer(ChannelReader<int> reader){try{await foreach (var item in reader.ReadAllAsync()){Console.WriteLine($"Processed: {item}");}}catch (Exception ex){Console.WriteLine($"Error: {ex.Message}");}}
}

高級配置

優化選項:

var options = new UnboundedChannelOptions()
{SingleWriter = true,  // 單一生產者優化SingleReader = false  // 允許多消費者
};

取消操作:通過 CancellationToken 取消讀寫。

await writer.WriteAsync(item, cancellationToken);

錯誤處理

生產者異常時,調用 writer.Complete(ex) 通知消費者。

消費者通過 try-catch 捕獲遍歷時的異常。

適用場景

數據流水線處理。

高吞吐量的異步任務。

多任務間的負載均衡。


C#中,System.Threading.Channels 是一個強大的異步通信機制,主要用于實現生產者-消費者模式。它提供了線程安全的通道(Channel),用于在不同線程之間傳遞數據。以下是關于C# Channel的詳細介紹:

Channel的類型

Channel有兩種類型:
有界通道(Bounded Channel):具有固定容量,當通道已滿時,可以根據指定的策略處理新消息。
無界通道(Unbounded Channel):沒有容量限制,適合生產者和消費者速度匹配的場景。

創建Channel

使用Channel.CreateBounded<T>創建有界通道,需要指定容量和滿時的處理策略(如WaitDropNewestDropOldest等)。
使用Channel.CreateUnbounded<T>創建無界通道。

寫入和讀取消息

生產者通過channel.Writer.WriteAsync()方法寫入消息。
消費者通過channel.Reader.ReadAsync()channel.Reader.WaitToReadAsync()讀取消息。

使用場景

Channel主要用于生產者-消費者模式,可以實現高效的異步數據處理。它支持多線程操作,并可以通過SingleReaderSingleWriter屬性限制通道的讀寫行為。

示例代碼

以下是一個簡單的生產者-消費者示例:

var channel = Channel.CreateBounded<int>(new BoundedChannelOptions(10)
{FullMode = BoundedChannelFullMode.Wait
});Task producer = Task.Run(async () =>
{for (int i = 0; i < 10; i++){await channel.Writer.WriteAsync(i);Console.WriteLine($"Produced: {i}");}channel.Writer.Complete();
});Task consumer = Task.Run(async () =>
{while (await channel.Reader.WaitToReadAsync()){if (channel.Reader.TryRead(out var item)){Console.WriteLine($"Consumed: {item}");}}
});await Task.WhenAll(producer, consumer);

注意事項

  • 緩沖區溢出:生產者寫入速度過快可能導致緩沖區溢出。
  • 正確關閉Channel:在數據完全消費后關閉Channel,避免數據丟失。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/897669.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/897669.shtml
英文地址,請注明出處:http://en.pswp.cn/news/897669.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

基于Spring Boot的牙科診所管理系統的設計與實現(LW+源碼+講解)

專注于大學生項目實戰開發,講解,畢業答疑輔導&#xff0c;歡迎高校老師/同行前輩交流合作?。 技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;…

upload-labs-靶場(1-19關)通關攻略

文件上傳漏洞是指由于程序員再開發時&#xff0c;未對用戶上傳的文件進行嚴格的驗證和過濾&#xff0c;而導致用戶可以上傳可執行的動態腳本文件 Pass-01&#xff08;前端驗證繞過&#xff09; 上傳111.php文件&#xff0c;發現彈窗顯示不允許&#xff0c;并給出白名單文件類…

使用 pytesseract 進行 OCR 識別:以固定區域經緯度提取為例

引言 在智能交通、地圖定位等應用場景中&#xff0c;經常會遇到需要從圖像中提取經緯度信息的需求。本篇文章將介紹如何利用 Python 的 pytesseract 庫結合 PIL 對圖像進行預處理&#xff0c;通過固定區域裁剪&#xff0c;來有效地識別出圖像上顯示的經緯度信息。 1. OCR 與 …

docker安裝和卸載

服務器系統&#xff1a;Ubuntu Server 18.04.2 64bit 1 安裝docker&#xff1a; 1.1 在線安裝 1.# yum install docker 1.2 離線安裝 https://download.csdn.net/download/qq_27106141/90477700 1.# docker-18.03.1-ce.tgz 1.2.1 解壓 tar -xzvf docker-18.03.1-ce.tgz 1.2.2…

機器人交互系統 部署構建

環境要求 Ubuntu 20.04 或更高版本ROS Noetic 或兼容版本Python 3.8 安裝步驟 1. 安裝ROS環境&#xff08;如未安裝&#xff09; sudo apt update sudo apt install ros-noetic-desktop-full source /opt/ros/noetic/setup.bash2. 創建工作空間并克隆代碼 mkdir -p ~/code…

【Go每日一練】構建一個簡單的用戶信息管理系統

&#x1f47b;創作者&#xff1a;丶重明 &#x1f47b;創作時間&#xff1a;2025年3月7日 &#x1f47b;擅長領域&#xff1a;運維 目錄 1.&#x1f636;?&#x1f32b;?題目&#xff1a;簡單的用戶信息管理系統2.&#x1f636;?&#x1f32b;?代碼開發3.&#x1f636;?&a…

全員DeepSeek時代,前端能做些什么?

全員DeepSeek時代&#xff0c;前端能做些什么&#xff1f; 前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;可以分享一下給大家。點擊跳轉到網站。 https://www.captainbed.cn/ccc #mermaid-svg-VNyL95jkz9jEXgUq {font-family:&…

Machine Learning: 十大基本機器學習算法

機器學習算法分類&#xff1a;監督學習、無監督學習、強化學習 基本的機器學習算法&#xff1a; 線性回歸、支持向量機(SVM)、最近鄰居(KNN)、邏輯回歸、決策樹、k平均、隨機森林、樸素貝葉斯、降維、梯度增強。 機器學習算法大致可以分為三類&#xff1a; 監督學習算法 (Sup…

【Linux docker 容器】關于想要讓虛擬機在開機時候也docker自己啟動,容器也自己啟動,省去要自己開docker和容器

確認 Docker 服務狀態&#xff1a; 首先&#xff0c;你需要確保 Docker 服務已經在虛擬機上安裝并正確配置。你可以使用如下命令來檢查 Docker 服務的狀態&#xff1a; systemctl status docker.service 如果服務沒有運行&#xff0c;你可以使用以下命令啟動它&#xff1a; s…

前端系統測試(單元、集成、數據|性能|回歸)

有關前端測試的面試題 系統測試 首先,功能測試部分。根據資料,單元測試是驗證最小可測試單元的正確性,比如函數或組件。都提到了單元測試的重要性,強調其在開發早期發現問題,并通過自動化提高效率。需要整合我搜索到的資料中的觀點,比如單元測試的方法(接口測試、路徑覆…

linux 命令 ls

ls 是 Linux 系統中用于列出目錄內容的核心命令&#xff0c;幾乎所有日常操作都會用到。以下是其詳細用法和常見場景說明 1. 基礎語法 ls [選項] [目錄/文件] 不指定目錄時&#xff0c;默認列出當前目錄的內容。 可以指定文件或目錄路徑&#xff0c;支持通配符&#xff08;如…

CI/CD—GitLab部署

GitLab簡介&#xff1a; GitLab 是一個用于代碼托管和軟件開發協作的平臺&#xff0c;在全球開發者社區及企業中應用廣泛&#xff0c;以下是對它的詳細介紹&#xff1a; 主要功能 代碼托管&#xff1a;提供了基于 Git 的代碼倉庫管理功能&#xff0c;支持創建、克隆、推送、…

ubuntu軟件

視頻軟件&#xff0c;大部分的編碼都能適應 sudo apt install vlc圖片軟件 sudo apt install gwenview截圖軟件 sudo apt install flameshot設置快捷鍵 flameshot flameshot gui -p /home/cyun/Pictures/flameshot也就是把它保存到一個自定義的路徑 菜單更換 sudo apt r…

Easysearch 使用 AWS S3 進行快照備份與還原:完整指南及常見錯誤排查

Easysearch 可以使用 AWS S3 作為遠程存儲庫&#xff0c;進行索引的快照&#xff08;Snapshot&#xff09;備份和恢復。同時&#xff0c;Easysearch 內置了 S3 插件&#xff0c;無需額外安裝。以下是完整的配置和操作步驟。 1. 在 AWS S3 上創建存儲桶 登錄 AWS 控制臺&#x…

【系統架構設計師】性能評估

目錄 1. 說明2. 基準測試程序3. Web服務器的性能評估4. 系統監視5. 例題5.1 例題1 1. 說明 1.性能評估是為了一個目的&#xff0c;按照一定的步驟&#xff0c;選用一定的度量項目&#xff0c;通過建模和實現&#xff0c;對一個系統的性能進行各項檢測&#xff0c;對測試結果做…

動態規劃-第2篇

前言&#xff1a;在上一篇文章中&#xff0c;我們了解了動態規劃的基本概念和解決問題的基本思路。通過分解問題、存儲子問題的解&#xff0c;動態規劃為我們提供了高效的解決方案。然而&#xff0c;動態規劃并不是一成不變的&#xff0c;它有很多不同的技巧和變種&#xff0c;…

基于Redis實現限流

限流盡可能在滿足需求的情況下越簡單越好&#xff01; 1、基于Redsi的increment方法實現固定窗口限流 Redis的increment方法保證并發線程安全窗口盡可能越小越好(太大可能某一小段時間就打滿請求剩下的都拿不到令牌了)這個原理其實就是用當前時間戳然后除窗口大小 在這個窗口大…

【工具使用】IDEA 社區版如何創建 Spring Boot 項目(詳細教程)

IDEA 社區版如何創建 Spring Boot 項目&#xff08;詳細教程&#xff09; Spring Boot 以其簡潔、高效的特性&#xff0c;成為 Java 開發的主流框架之一。雖然 IntelliJ IDEA 專業版提供了Spring Boot 項目向導&#xff0c;但 社區版&#xff08;Community Edition&#xff09…

探索高性能AI識別和邊緣計算 | NVIDIA Jetson Orin Nano 8GB 開發套件的全面測評

隨著邊緣計算和人工智能技術的迅速發展&#xff0c;性能強大的嵌入式AI開發板成為開發者和企業關注的焦點。NVIDIA近期推出的Jetson Orin Nano 8GB開發套件&#xff0c;憑借其40 TOPS算力、高效的Ampere架構GPU以及出色的邊緣AI能力&#xff0c;引起了廣泛關注。本文將從配置性…

緊急救援!MySQL數據庫誤刪后的3種恢復方案

一、誤刪場景分類與恢復策略 ?常見誤操作場景?: DROP TABLE 誤刪單表(高頻事故)DELETE 誤刪數據(可通過事務回滾搶救)DROP DATABASE 刪除整個庫(需全量備份)服務器rm -rf(物理文件刪除)?恢復方案選擇矩陣?: 場景推薦方案時間窗口表結構刪除(DROP)備份恢復 + B…