在面對 生產者-消費者 的場景下, netcore 提供了乙個新的命名空間 atgrxqynysystem.threading.channels 來幫助我們更高效的處理此類問題,有了這個 channels 存在, 生產者 和 消費者 可以各自處理自己的任務而不相互干擾,有利於兩方的併發處理,這篇文章我們就來討論下如何使用 system.threading.channels。
在 system.threading.tasks.dataflow 命名空間下提供了乙個資料流庫,主要封裝了 儲存 和 處理 兩大塊,該庫專注於 pipeline 處理,而 system.threading.tasks.channels 主要專注於 儲存 這塊,從單一職責上來說,在 生產者-消費者 場景下,channels 比 dataflow 效能要高得多。
可以利用 channels 來實現程式設計客棧 生產者和消費者 之間的解耦,大體上有兩個好處:
總的來說,在 生產者-消費者 模式下可以幫助我們提高應用程式的吞吐率。
要想使用 channel,需要用 nuget 引用 system.threading.channels 包,還可以通過 visual studio 2019 的 nuget package manager 視覺化介面安裝 或者 通過 nuget package manager 命令列工具輸入以下命令:
dotnet add package system.threading.channels
本質上來說,你可以建立兩種型別的 channel,一種是有限容量的 bound channel,一種是無限容量的 unbound channel,接下來的問題是,如何建立呢?channels 提供了兩種 工廠方法 用於建立,如下**所示:
下面的**片段展示了如何建立 unbounded channel,並且只能存放 string 型別。
static void main(string args)
對了,bounded channel 還提供了乙個 fullmode 屬性,用於指定當 channel 已滿時該如何對插入的 message 進行處理,通常有四種做法。
下面的**片段展示了如何在 bounded channel 上使用 fullmode。
static void main(string args)
); }
要想將 message 寫入到 channel,可以使用 writeasync() 方法,如下**所示:
static async task main(string args)
);await channel.writer.writeasync("hello world!");
}要想從 channel 中讀取 message,可以使用 readasync(),如下**所示:
static async task main(string args)
);while (await channel.reader.waittoreadasync())}}
下面是完整的**清單,展示了如何從 channel 中讀寫 message。
class program
public static async tas程式設計客棧k singleproducersingleconsumer()
while (await reader.waittoreadasync())
}} }
可以看到,控制台中輸出了數字 1-10,這些數字正是 writer 寫入到 channel 中的,對吧。
在C 中使用Queue
介紹 queue類執行將放在在queue中的物件採用先進先出的資料結構。物件從一端插入到佇列中從另一端移除。物件的順序程序使用queue queue介面 queue類實現了三個主要集合介面 icollection ienumerable和icloneable。queue的重要方法 queue類常用的...
在 C 中使用畫筆
出處 在 c 中使用畫筆 public class rectangle shape protected point m start protected point m end public rectangle point start,point end,color fgcolor m start s...
在 C 中使用 Python script
想要在c 中嵌入script 除了自己寫指令碼引擎外,lua,python 都可以在c 中使用,另外 monobind,angelscript library 都是一些c script library,可以嵌入到c 中使用 今天在c 中試著嵌入 python 示例 在 python 2.5.2 de...