日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C#阻塞队列BlockingCollection

發(fā)布時(shí)間:2023/12/4 C# 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C#阻塞队列BlockingCollection 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

BlockingCollection是一個(gè)比較冷門的類,我們先看下官方對(duì)這個(gè)類的定義:

簡(jiǎn)單來說,BlockingCollection就是一個(gè)線程安全的阻塞隊(duì)列,利用阻塞這個(gè)特性,我們可以實(shí)現(xiàn)進(jìn)程內(nèi)的生產(chǎn)者-消費(fèi)者模式,比如消息轉(zhuǎn)發(fā)、日志記錄等。

下面我們看一個(gè)例子,其用來實(shí)現(xiàn)消息轉(zhuǎn)發(fā),先定義一個(gè)MessageDistributer類,代碼如下:

上面的代碼很簡(jiǎn)單,使用BlockingCollection定義一個(gè)消息隊(duì)列,然后使用AddMessage方法向隊(duì)列中添加消息。重點(diǎn)看一下Process方法,里面寫了一個(gè)死循環(huán),里面調(diào)用BlockingCollection的Take方法,當(dāng)隊(duì)列中如果沒有消息時(shí),則阻塞隊(duì)列,所以并不會(huì)一直循環(huán)。等到有新消息進(jìn)來時(shí),它就會(huì)繼續(xù)處理。還有一個(gè),我們?cè)谶@個(gè)類中使用單獨(dú)的線程來作執(zhí)行Process方法。我們?cè)倏匆幌抡{(diào)用的地方,代碼如下:

這里的代碼就不多解釋了,就是實(shí)例化MessageDistributer類,并開啟線程,然后接收客戶端輸入的消息,我們運(yùn)行一下,看下效果。如下:

這個(gè)簡(jiǎn)單的例子就結(jié)束了,大家可以按這個(gè)思路寫個(gè)日志記錄的類,思路就是單獨(dú)使用一個(gè)線程輪詢阻塞隊(duì)列。其實(shí)還可以將Action委托作為消息放到隊(duì)列中,這樣可以實(shí)現(xiàn)一個(gè)任務(wù)執(zhí)行器。代碼如下:

到這里就可以說結(jié)束了,不過我們可以利用ManualResetEvent來自己實(shí)現(xiàn)一個(gè)簡(jiǎn)單的阻塞隊(duì)列,如果你有興趣,可以接著往下看。ManualResetEvent使用信號(hào)來做線程間的通信,當(dāng)隊(duì)列為空時(shí),我們一直阻塞著線程就行。簡(jiǎn)單實(shí)現(xiàn)一個(gè),代碼如下:

上面的代碼我就不多解釋了,也比較簡(jiǎn)單,主要就是為隊(duì)列的時(shí)候阻塞線程(WaitOne),添加項(xiàng)的時(shí)候發(fā)送信號(hào)(Set)。然后用自己封裝的BlockingQueue替換消息轉(zhuǎn)發(fā)類中BlockingCollection,最后運(yùn)行正常,我就不再演示了。

最后總結(jié)一下,BlockingCollection這個(gè)類,我們平時(shí)用的比較少,如果你有在進(jìn)程內(nèi)用到消息訂閱或單獨(dú)開線程跑任務(wù)的場(chǎng)景時(shí),你可以留意一下它,當(dāng)然你也可以用Timer來實(shí)現(xiàn)。如果今天的內(nèi)容能幫到你一點(diǎn)點(diǎn),就給個(gè)贊吧(關(guān)注就更好了),拜拜~~

總結(jié)

以上是生活随笔為你收集整理的C#阻塞队列BlockingCollection的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。