The Nuget Library "Nito.AsyncEx" contains powerful collections that makes it possible to create asynchronous collections that support Producer-Consumer scenarios. First off, let us install the Nuget package:
Install-Package Nito.AsyncEx
using Nito.AsyncEx;
using System;
using System.Collections.Concurrent;
using System.Threading.Tasks;
namespace AsyncCollectionDemo
{
class Program
{
private static readonly AsyncCollection<int> _asyncStack = new AsyncCollection<int>(new ConcurrentStack<int>(), maxCount: 1);
static void Main(string[] args)
{
ProducerConsumerDemo();
}
private static async void ConsumerThread()
{
await Task.Run(async () =>
{
//Consumer code
while (await _asyncStack.OutputAvailableAsync())
{
Console.WriteLine(await _asyncStack.TakeAsync());
//Thread.Sleep(1000);
}
});
}
private static async void ProducerConsumerDemo()
{
ConsumerThread();
//Producer code
await _asyncStack.AddAsync(7);
await _asyncStack.AddAsync(13);
await _asyncStack.AddAsync(19);
_asyncStack.CompleteAdding();
Console.WriteLine("Press any key to continue ..");
Console.ReadKey();
}
}
}
We can use the AsyncCollection to create one or multiple producer threads and then return the results to the
consumer threads. The benefit of this Collection compared to the BlockingCollection in BCL is that since it supports
async, the consumer can be an UI thread for example. So you can have code that produces results and delivers them back to the user Interface.
You can ofcourse skip using the ConcurrentStack if you want a FIFO ordering instead of the stack's LIFO ordering.
The creator of Nito.AsyncEx is created by Stephen Cleary, which also is the author of the good book "Concurrency in C# Cookboox"
which is an O'Reilly book.
Share this article on LinkedIn.
Are you looking to make cash from your visitors by using popunder advertisments?
ReplyDeleteIf so, did you try using Clickadu?