大佬教程收集整理的这篇文章主要介绍了C#BlockingCollection生成者使用者而不阻塞使用者线程,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我认为只有在队列中有东西需要处理才能运行消费者任务会更好,但是,我无法找到能够提供最佳实践的样本.
我提出了类似于下面的解决方案.但问题是,每个项目都会产生一个新任务(这可能是效率低下的?浪费资源?).但是如果我没有为每个项目创建一个新任务,我不能保证一个项目不会在未处理的队列中.
private object _processSyncObj = new object(); private volatile bool _isProcessing; private BlockingCollection<String> _queue = new BlockingCollection<String>(); private void EnqueueItem(String item) { _queue.Add(item); Task.Factory.StartNew(ProcessQueuE); } private void ProcessQueue() { if (_isProcessing) return; lock (_processSyncObj) { String item; while (_isProcessing = _queue.TryTake(out item)) { // process item } } }
Task Parallelism (Task Parallel Library)
…但是你所做的,最终将只是一个正常的任务编程,因为对于每个入队你开始一个任务,所以阻塞集合是非常未使用的.据了解,您关注的是关于触发任务并让Taskscheduler在他们到达时按顺序运行作业.
如何使用Task编程模式,以及自定义Taskscheduler来控制计划任务的流程呢?
例如,您可以创建一个orderedTaskscheduler,它派生自一个行为如此的LimitedConcurrencyLevelTaskscheduler ……
您可以找到已经开发的这些调度程序,它们被称为ParallelExtensionsExtras,您可以从here下载它,并从blog post和others阅读一些有关它的文章.
您也可以直接在nuget找到它,并在github找到代码镜像.
请享用!
以上是大佬教程为你收集整理的C#BlockingCollection生成者使用者而不阻塞使用者线程全部内容,希望文章能够帮你解决C#BlockingCollection生成者使用者而不阻塞使用者线程所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。