Пример #1
0
        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);
                    }
                }
            }
        }
Пример #2
0
        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);
                    }
                }
            }
        }