C#阻塞队列BlockingCollection
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)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在传统行业做数字化转型之业务篇
- 下一篇: c# char unsigned_dll