csharp 生产者 - 消费者模板类
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了csharp 生产者 - 消费者模板类相关的知识,希望对你有一定的参考价值。
namespace DEMon
{
/// <summary>
/// Abstract class to faciliate the construction of processors that follow producer-consumer pattern.
/// Example: typical invokation sequence
/// ProducerConsumer.Init()
/// ProducerConsumer.Add(work_item)
/// ProducerConsumer.CompleteAndWait();
/// </summary>
/// <typeparam name="T">type of the work item</typeparam>
public abstract class ProducerComsumer<T>
{
private BlockingCollection<T> queue;
private ManualResetEvent initFinished;
private ManualResetEvent doneUpload;
private long totalItems;
public bool Done { get; private set; }
public const int QueueCapacity = 87352;
protected ProducerComsumer(int maxParallism = 64)
{
queue = new BlockingCollection<T>(QueueCapacity);
doneUpload = new ManualResetEvent(false);
initFinished = new ManualResetEvent(false);
Done = false;
Task.Run(() =>
{
initFinished.WaitOne();
Parallel.ForEach(queue.GetConsumingEnumerable(), new ParallelOptions() { MaxDegreeOfParallelism = maxParallism }, Process);
doneUpload.Set();
});
}
protected abstract void Process(T item);
public void Add(T item)
{
queue.Add(item);
}
protected abstract void Initialize();
public void Init()
{
Initialize();
initFinished.Set();
}
public void CompleteAndWait()
{
if (!queue.IsAddingCompleted)
{
queue.CompleteAdding();
}
doneUpload.WaitOne();
Done = true;
}
public void CompleteAdding()
{
queue.CompleteAdding();
}
public long QueueSize()
{
return queue.Count;
}
}
}
以上是关于csharp 生产者 - 消费者模板类的主要内容,如果未能解决你的问题,请参考以下文章
单生产者/单消费者 的 FIFO 无锁队列
rabbitmq消费者生产者实践
避免消费者/生产者类的并发问题[关闭]
生产者与消费者问题解决:解决先打印出消费的情况
通过生产者消费者模式例子讲解Java基类方法waitnotifynotifyAll
java生产者——消费者 线程模型