Exemple #1
0
 private void EndTask()
 {
     lock (_lockSync)
     {
         _currentTask = null;
         _queuedTasks.Dequeue();
     }
     OutstandingTaskCountChanged.Raise(this);
 }
Exemple #2
0
    public Task <TResult> QueueTask <TResult>(Task <Task <TResult> > taskGenerator)
    {
        Task <TResult> unwrapped = taskGenerator.Unwrap();

        unwrapped.ContinueWith(_ =>
        {
            EndTask();
            StartNextTaskIfQueued();
        }, TaskContinuationOptions.ExecuteSynchronously);
        lock (_lockSync)
        {
            _queuedTasks.Enqueue(taskGenerator);
            if (_currentTask == null)
            {
                StartNextTaskIfQueued();
            }
        }
        TaskCompletionSource <TResult> tcs = new TaskCompletionSource <TResult>();

        tcs.TrySetFromTaskIncomplete(unwrapped);
        OutstandingTaskCountChanged.Raise(this);
        return(tcs.Task);
    }