使用并行处理实现队列-不同的方法

时间:2018-08-20 07:35:42

标签: c# multithreading queue

我想讨论并行app.post('/user', [ check.query('username') ], (req, res) => { //your code }); 处理的不同方法。

实施1,使用queueBlockingCollection

Task.Parallel

在这里我读到private BlockingCollection<Item> _collection = new BlockingCollection<Item>(); Void StartQueue() { Task.Factory.StartNew(async (s) => { var partitioner = Partitioner.Create(_collection.GetConsumingEnumerable(token), EnumerablePartitionerOptions.NoBuffering); Parallel.ForEach(partitioner, parallelOptions, async item => { ..process(item); }); }, new System.Threading.CancellationToken(), TaskCreationOptions.LongRunning); } void EnqueItem(Item item) { _collection.Add(item); } BlockingCollection都使用了锁,这使得它们不能很好地协同工作。

实施2,使用Task.ParallelConcurrentQueue

Task.Parallel

实施3,使用private ConcurrentQueue<Item> _queue = new ConcurrentQueue<Item>(); Void StartQueue() { Task.Factory.StartNew(async (x) => { while (true) { var partitioner = Partitioner.Create(_queue, EnumerablePartitionerOptions.NoBuffering); Parallel.ForEach(partitioner, parallelOptions, async item => { ..process(item); }) Task.Delay(TIMEOUT_MS); } ; }, new System.Threading.CancellationToken(), TaskCreationOptions.LongRunning); } void EnqueItem(Item item) { _queue.Enqueue(item); } BlockingCollection

SemaphoreSlim

您如何看待此实现,并且该任务有更好的实现。

0 个答案:

没有答案