private void EndTask() { lock (_lockSync) { _currentTask = null; _queuedTasks.Dequeue(); } OutstandingTaskCountChanged.Raise(this); }
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); }