1. 程式人生 > >如何在 C# 8 中使用 Channels

如何在 C# 8 中使用 Channels

在面對 `生產者-消費者` 的場景下, netcore 提供了一個新的名稱空間 `System.Threading.Channels` 來幫助我們更高效的處理此類問題,有了這個 Channels 存在, `生產者` 和 `消費者` 可以各自處理自己的任務而不相互干擾,有利於兩方的併發處理,這篇文章我們就來討論下如何使用 `System.Threading.Channels`。 ## Dataflow vs Channel 在 `System.Threading.Tasks.Dataflow` 名稱空間下提供了一個數據流庫,主要封裝了 `儲存` 和 `處理` 兩大塊,該庫專注於 pipeline 處理,而 `System.Threading.Tasks.Channels` 主要專注於 `儲存` 這塊,從單一職責上來說,在 `生產者-消費者` 場景下,Channels 比 Dataflow 效能要高得多。 ## 為什麼要使用 Channels 可以利用 Channels 來實現 `生產者和消費者` 之間的解耦,大體上有兩個好處: * 生產者 和 消費者 是相互獨立的,兩者可以並行執行。 * 如果生產者不給力,可以建立多個的生產者,如果消費者不給力,可以建立更多的消費者。 總的來說,在 `生產者-消費者` 模式下可以幫助我們提高應用程式的吞吐率。 ## 安裝 System.Threading.Channels 要想使用 Channel,需要用 nuget 引用 `System.Threading.Channels` 包,還可以通過 Visual Studio 2019 的 `NuGet package manager` 視覺化介面安裝 或者 通過 `NuGet package manager` 命令列工具輸入以下命令: ``` C# dotnet add package System.Threading.Channels ``` ## 建立 channel 本質上來說,你可以建立兩種型別的 channel,一種是有限容量的 `bound channel`,一種是無限容量的 `unbound channel`,接下來的問題是,如何建立呢?Channels 提供了兩種 **工廠方法** 用於建立,如下程式碼所示: * `CreateBounded