ОК, наконец-то я так и сделал (псевдокод):
public TimeSpan CheckInterval { get; private set; } = TimeSpan.FromMinutes(1);
public TimeSpan MaxAllowedDeviation { get; private set; } = TimeSpan.FromSeconds(1);
private async Task CheckTimeUpdate()
{
while (cancelToken.IsCancellationRequested == false)
{
DateTimeOffset beforeTimer = DateTimeOffset.Now;
await Task.Delay(CheckInterval, cancelToken);
DateTimeOffset afterTimer = DateTimeOffset.Now;
if ((afterTimer.UtcDateTime - beforeTimer.UtcDateTime).Duration() > MaxAllowedDeviation + CheckInterval)
{
//raises the event
TimeChanged?.Invoke();
}
}
}
Но это работает только для ручного изменения времени, а не для перехода на летнее время или обновления часового пояса !!