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); } } } }
public Task WaitForIdle(CancellationToken ctoken) { if (ctoken.IsCancellationRequested) { return(Task.FromException <bool>(new OperationCanceledException(ctoken))); } else { lock (syncRoot) { if (referenceCount == 0) { return(Task.FromResult(true)); } else { TaskCompletionSource <bool> k = new TaskCompletionSource <bool>(); Waiter waiter = new Waiter() { id = null, k = k, ctoken = ctoken, ctr = null, }; long id = waiters.Enqueue(waiter); waiter.id = id; Utils.PostRegistration(ctoken, ctr => SetRegistrationForWait(id, ctr), () => CancelWait(id)); return(k.Task); } } } }