public async Task RunAsync(CancellationToken cancellationToken) { var cancellationTaskSource = new TaskCompletionSource <bool>(TaskCreationOptions.RunContinuationsAsynchronously); using (cancellationToken.Register(() => cancellationTaskSource.TrySetCanceled())) { var state = new SchedulerState(cancellationTaskSource.Task, cancellationToken); while (controller.ShouldStillOperateOn(state)) { synchronizer.Synchronize(state); var completedJobTask = await jobWaiter.WaitForNextCompletedJob(state).ConfigureAwait(false); if (controller.ShouldStillOperateOn(state)) { jobHandler.HandleCompletedJob(completedJobTask, state); } else { break; } } foreach (var sendingJob in state.SendingJobs) { await sendingJob.SilentlyContinue().ConfigureAwait(false); } synchronizer.Synchronize(state); foreach (var job in state.AllJobs.Values.Where(job => job.IsHealthy)) { await job.SendAsync(CancellationToken.None).SilentlyContinue().ConfigureAwait(false); } } }