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();
                    }
                }
            }
        }
Exemple #2
0
        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;
                    }
                }
            }
        }