Ejemplo n.º 1
0
        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);
                }
            }
        }