Hermann Jung
Не знаю, соответствует ли он вашим требованиям. Но для меня это работает.
public void InitJob()
{
Action job = () => { Console.WriteLine($"Running {DateTime.Now}"); };
Func<DateTime> computeNextStart = () =>
{
var now = DateTime.Now;
return now.Date
+ TimeSpan.FromHours(now.Hour)
+ TimeSpan.FromMinutes(now.Minute + 1);
};
ThreadPool.QueueUserWorkItem(
(state) => ExecuteJobTimedAsync(job, computeNextStart));
}
private static async void ExecuteJobTimedAsync(
Action job,
Func<DateTime> computeNextStart)
{
DateTime waitUntil = computeNextStart();
TimeSpan wait = waitUntil - DateTime.Now;
if (wait > TimeSpan.Zero) await Task.Delay(wait).ConfigureAwait(false);
job();
ThreadPool.QueueUserWorkItem(
(state) => ExecuteJobTimedAsync(job, computeNextStart));
}
Пример выполняет задание каждую полную минуту (см. computeNextStart), в то время как задание не занимает больше минуты.