C#Timer

 protected virtual async Task ScheduleJob(CancellationToken cancellationToken)
        {
            var next = _expression.GetNextOccurrence(DateTimeOffset.Now, _timeZoneInfo);
            if (next.HasValue)
            {
                var delay = next.Value - DateTimeOffset.Now;
                _timer = new System.Timers.Timer(delay.TotalMilliseconds);
                _timer.Elapsed += async (sender, args) =>
                {
                    _timer.Dispose();  // reset and dispose timer
                    _timer = null;

                    if (!cancellationToken.IsCancellationRequested)
                    {
                        await DoWork(cancellationToken);
                    }

                    if (!cancellationToken.IsCancellationRequested)
                    {
                        await ScheduleJob(cancellationToken);    // reschedule next
                    }
                };

                System.Threading.Timer timer = new Timer(new TimerCallback(async (obj) =>
              {
                  _timer.Dispose();  // reset and dispose timer
                    _timer = null;

                  if (!cancellationToken.IsCancellationRequested)
                  {
                      await DoWork(cancellationToken);
                  }

                  if (!cancellationToken.IsCancellationRequested)
                  {
                      await ScheduleJob(cancellationToken);    // reschedule next
                    }
              }), null, 0, System.Threading.Timeout.Infinite);
                _timer.Start();
            }
            await Task.CompletedTask;
        }

  

posted @ 2020-06-11 13:54  啊哈徐  阅读(193)  评论(0编辑  收藏  举报