private void CompleteWork(int workerId) { lock (syncRoot) { busyWorkers = busyWorkers.Remove(workerId); idleWorkers = idleWorkers.Add(workerId); if (waitingWorkItems.Count > 0) { WaitingWorkItem wwi = waitingWorkItems.Dequeue(); if (wwi.work is Func <int, Task> ) { wwi.k.PostResult(StartWorker((Func <int, Task>)wwi.work)); } else { wwi.k.PostResult(StartWorker((Func <int, CancellationToken, Task>)wwi.work, wwi.ctoken)); } if (wwi.ctr.HasValue) { wwi.ctr.Value.Dispose(); } } } }
public Task <Task> StartWorkItem(Func <int, CancellationToken, Task> work, CancellationToken ctoken) { if (ctoken.IsCancellationRequested) { #if NET451 var tcs = new TaskCompletionSource <Task>(); tcs.SetException(new OperationCanceledException(ctoken)); return(tcs.Task); #else return(Task.FromException <Task>(new OperationCanceledException(ctoken))); #endif } else { lock (syncRoot) { if (idleWorkers.Count > 1) { return(Task.FromResult <Task>(StartWorker(work, ctoken))); } else { TaskCompletionSource <Task> k = new TaskCompletionSource <Task>(); WaitingWorkItem wa = new WaitingWorkItem() { id = null, work = work, ctoken = ctoken, ctr = null, k = k }; long id = waitingWorkItems.Enqueue(wa); wa.id = id; Utils.PostRegistration(ctoken, ctr => SetRegistrationForWorkItem(id, ctr), () => CancelWorkItem(id)); return(k.Task); } } } }
public Task<Task> StartWorkItem(Func<int, Task> work, CancellationToken ctoken) { if (ctoken.IsCancellationRequested) { return Task.FromException<Task>(new OperationCanceledException(ctoken)); } else { lock (syncRoot) { if (idleWorkers.Count > 1) { return Task.FromResult<Task>(StartWorker(work)); } else { TaskCompletionSource<Task> k = new TaskCompletionSource<Task>(); WaitingWorkItem wa = new WaitingWorkItem() { id = null, work = work, ctoken = ctoken, ctr = null, k = k }; long id = waitingWorkItems.Enqueue(wa); wa.id = id; Utils.PostRegistration(ctoken, ctr => SetRegistrationForWorkItem(id, ctr), () => CancelWorkItem(id)); return k.Task; } } } }