BlockingCollection是一個比較冷門的類,咱們先看下官方對這個類的定義:安全
簡單來講,BlockingCollection就是一個線程安全的阻塞隊列,利用阻塞這個特性,咱們能夠實現進程內的生產者-消費者模式,好比消息轉發、日誌記錄等。線程
下面咱們看一個例子,其用來實現消息轉發,先定義一個MessageDistributer類,代碼以下:日誌
上面的代碼很簡單,使用BlockingCollection定義一個消息隊列,而後使用AddMessage方法向隊列中添加消息。重點看一下Process方法,裏面寫了一個死循環,裏面調用BlockingCollection的Take方法,當隊列中若是沒有消息時,則阻塞隊列,因此並不會一直循環。等到有新消息進來時,它就會繼續處理。還有一個,咱們在這個類中使用單獨的線程來做執行Process方法。咱們再看一下調用的地方,代碼以下:隊列
這裏的代碼就很少解釋了,就是實例化MessageDistributer類,並開啓線程,而後接收客戶端輸入的消息,咱們運行一下,看下效果。以下:進程
這個簡單的例子就結束了,你們能夠按這個思路寫個日誌記錄的類,思路就是單獨使用一個線程輪詢阻塞隊列。其實還能夠將Action委託做爲消息放到隊列中,這樣能夠實現一個任務執行器。代碼以下:
消息隊列
到這裏就能夠說結束了,不過咱們能夠利用ManualResetEvent來本身實現一個簡單的阻塞隊列,若是你有興趣,能夠接着往下看。ManualResetEvent使用信號來作線程間的通訊,當隊列爲空時,咱們一直阻塞着線程就行。簡單實現一個,代碼以下:it
上面的代碼我就很少解釋了,也比較簡單,主要就是爲隊列的時候阻塞線程(WaitOne),添加項的時候發送信號(Set)。而後用本身封裝的BlockingQueue替換消息轉發類中BlockingCollection,最後運行正常,我就再也不演示了。io
最後總結一下,BlockingCollection這個類,咱們平時用的比較少,若是你有在進程內用到消息訂閱或單獨開線程跑任務的場景時,你能夠留意一下它,固然你也能夠用Timer來實現。若是今天的內容能幫到你一點點,就給個贊吧(關注就更好了),拜拜~~class