The indexed multi-thread queue.
This library was built to manage a large queue of long running parallel processes. Parallelization is easily configured and threading is managed internally. The queue is indexed in a library for fast lookups of running tasks, and to provide the ability to reject items which are already in queue.
Package Name | Target Framework | Version |
---|---|---|
DistinctQueueProcessor | .NET Standard 2.0 |
The main contents of this library are in a single abstract class, DQP.DistinctQueueProcessor<T>
. Create your own derivative class which overrides the following required methods:
Process(T item)
- Do your work here. This method is run on a threaded task.
Error(T item, Exception ex)
- Called when an exception is caught from
Process(T item)
. Throwing an exception here will kill the running worker so take care.
- Called when an exception is caught from
Also provided is an wrapper which takes Actions in the constructor. See the examples below for more detail.
Create a new class inheriting from DistinctQueueProcessor<T>
where T
is the type of object you want to enqueue.
class DqpExample : DistinctQueueProcessor<string>
{
protected override void Error(string item, Exception ex)
{
Console.Error.WriteLine(ex.ToString());
}
protected override void Process(string item)
{
// This will be run on a thread, so don't be surprised if messages print out-of-order.
Console.WriteLine(item);
}
}
You'd then use your class as follows:
var example = new DqpExample();
example.AddItem("Hello, world!");
If inheriting from DistinctQueueProcessor
in a custom class is too heavy for your use case, ActionQueue
can be used instead. It's a simple wrapper around the base class which takes two action as constructor parameters.
var actionQueue = new ActionQueue<string>(
new Action<string>(x =>
{
Console.WriteLine(item);
}),
new Action<string, Exception>((x, ex) =>
{
Console.Error.WriteLine(ex.ToString());
}));
actionQueue.AddItem("Hello, world!");
Internally the queue is indexed using a Dictionary<string, T>
, where the key is T.ToString()
. Ensure your T
has a ToString
implementation which returns short unique values.