Skip to content

Instantly share code, notes, and snippets.

@jonnii
Created January 14, 2013 14:54
Show Gist options
  • Save jonnii/4530568 to your computer and use it in GitHub Desktop.
Save jonnii/4530568 to your computer and use it in GitHub Desktop.
using System.Collections.Concurrent;
using System.Linq;
using System.Threading.Tasks;
namespace Chinchilla
{
public class TaskDeliveryStrategy : DeliveryStrategy
{
private readonly ConcurrentDictionary<int, TaskWorker> workers;
public TaskDeliveryStrategy()
{
workers = new ConcurrentDictionary<int, TaskWorker>();
}
public override void Deliver(IDelivery delivery)
{
DeliverOnTask(delivery);
}
public override WorkerState[] GetWorkerStates()
{
return workers.Values.Select(v => v.GetState()).ToArray();
}
public Task DeliverOnTask(IDelivery delivery)
{
var worker = new TaskWorker(connectedProcessor);
workers.TryAdd(worker.GetHashCode(), worker);
var currentDelivery = delivery;
return Task
.Factory
.StartNew(
() =>
{
worker.BeforeDeliver();
worker.Deliver(currentDelivery);
})
.ContinueWith(
t =>
{
if (t.IsFaulted)
{
currentDelivery.Failed(t.Exception);
}
else
{
currentDelivery.Accept();
}
worker.AfterDeliver();
TaskWorker removed;
workers.TryRemove(worker.GetHashCode(), out removed);
});
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment