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;
        }

  

原文地址:https://www.cnblogs.com/francisXu/p/13092810.html