C#阻塞队列BlockingCollection

BlockingCollection是一个比较冷门的类,咱们先看下官方对这个类的定义:安全

简单来讲,BlockingCollection就是一个线程安全的阻塞队列,利用阻塞这个特性,咱们能够实现进程内的生产者-消费者模式,好比消息转发、日志记录等。线程

下面咱们看一个例子,其用来实现消息转发,先定义一个MessageDistributer类,代码以下:日志

上面的代码很简单,使用BlockingCollection定义一个消息队列,而后使用AddMessage方法向队列中添加消息。重点看一下Process方法,里面写了一个死循环,里面调用BlockingCollection的Take方法,当队列中若是没有消息时,则阻塞队列,因此并不会一直循环。等到有新消息进来时,它就会继续处理。还有一个,咱们在这个类中使用单独的线程来做执行Process方法。咱们再看一下调用的地方,代码以下:队列

这里的代码就很少解释了,就是实例化MessageDistributer类,并开启线程,而后接收客户端输入的消息,咱们运行一下,看下效果。以下:进程

这个简单的例子就结束了,你们能够按这个思路写个日志记录的类,思路就是单独使用一个线程轮询阻塞队列。其实还能够将Action委托做为消息放到队列中,这样能够实现一个任务执行器。代码以下:
消息队列

到这里就能够说结束了,不过咱们能够利用ManualResetEvent来本身实现一个简单的阻塞队列,若是你有兴趣,能够接着往下看。ManualResetEvent使用信号来作线程间的通讯,当队列为空时,咱们一直阻塞着线程就行。简单实现一个,代码以下:it

上面的代码我就很少解释了,也比较简单,主要就是为队列的时候阻塞线程(WaitOne),添加项的时候发送信号(Set)。而后用本身封装的BlockingQueue替换消息转发类中BlockingCollection,最后运行正常,我就再也不演示了。io

最后总结一下,BlockingCollection这个类,咱们平时用的比较少,若是你有在进程内用到消息订阅或单独开线程跑任务的场景时,你能够留意一下它,固然你也能够用Timer来实现。若是今天的内容能帮到你一点点,就给个赞吧(关注就更好了),拜拜~~class

相关文章
相关标签/搜索