C#阻塞队列BlockingCollection
BlockingCollection是一個比較冷門的類,我們先看下官方對這個類的定義:
簡單來說,BlockingCollection就是一個線程安全的阻塞隊列,利用阻塞這個特性,我們可以實現進程內的生產者-消費者模式,比如消息轉發、日志記錄等。
下面我們看一個例子,其用來實現消息轉發,先定義一個MessageDistributer類,代碼如下:
上面的代碼很簡單,使用BlockingCollection定義一個消息隊列,然后使用AddMessage方法向隊列中添加消息。重點看一下Process方法,里面寫了一個死循環,里面調用BlockingCollection的Take方法,當隊列中如果沒有消息時,則阻塞隊列,所以并不會一直循環。等到有新消息進來時,它就會繼續處理。還有一個,我們在這個類中使用單獨的線程來作執行Process方法。我們再看一下調用的地方,代碼如下:
這里的代碼就不多解釋了,就是實例化MessageDistributer類,并開啟線程,然后接收客戶端輸入的消息,我們運行一下,看下效果。如下:
這個簡單的例子就結束了,大家可以按這個思路寫個日志記錄的類,思路就是單獨使用一個線程輪詢阻塞隊列。其實還可以將Action委托作為消息放到隊列中,這樣可以實現一個任務執行器。代碼如下:
到這里就可以說結束了,不過我們可以利用ManualResetEvent來自己實現一個簡單的阻塞隊列,如果你有興趣,可以接著往下看。ManualResetEvent使用信號來做線程間的通信,當隊列為空時,我們一直阻塞著線程就行。簡單實現一個,代碼如下:
上面的代碼我就不多解釋了,也比較簡單,主要就是為隊列的時候阻塞線程(WaitOne),添加項的時候發送信號(Set)。然后用自己封裝的BlockingQueue替換消息轉發類中BlockingCollection,最后運行正常,我就不再演示了。
最后總結一下,BlockingCollection這個類,我們平時用的比較少,如果你有在進程內用到消息訂閱或單獨開線程跑任務的場景時,你可以留意一下它,當然你也可以用Timer來實現。如果今天的內容能幫到你一點點,就給個贊吧(關注就更好了),拜拜~~
總結
以上是生活随笔為你收集整理的C#阻塞队列BlockingCollection的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在传统行业做数字化转型之业务篇
- 下一篇: C# WPF:把文件给我拖进来!!!