From 38c704b9fb687fc472de08e0ec5a8d86d6a20619 Mon Sep 17 00:00:00 2001 From: XorogVEVO Date: Fri, 3 Dec 2021 12:39:59 +0100 Subject: [PATCH] Task Shedule now uses Int64 --- UniversalExtensions.cs | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/UniversalExtensions.cs b/UniversalExtensions.cs index 59e9ea4..bba406a 100644 --- a/UniversalExtensions.cs +++ b/UniversalExtensions.cs @@ -168,6 +168,23 @@ public static class UniversalExtensions + internal static async Task LongDelay(TimeSpan delay, CancellationTokenSource token) + { + var st = new Stopwatch(); + st.Start(); + while (true && !token.IsCancellationRequested) + { + var remaining = (delay - st.Elapsed).TotalMilliseconds; + if (remaining <= 0) + break; + if (remaining > Int16.MaxValue) + remaining = Int16.MaxValue; + await Task.Delay(TimeSpan.FromMilliseconds(remaining), token.Token); + } + } + + + /// /// Create a scheduled task /// @@ -179,10 +196,10 @@ public static class UniversalExtensions string UID = Guid.NewGuid().ToString(); CancellationTokenSource CancellationToken = new CancellationTokenSource(); - if ((int)Math.Ceiling(runTime.GetTimespanUntil().TotalMilliseconds) < 0) + if (Math.Ceiling(runTime.GetTimespanUntil().TotalMilliseconds) < 0) runTime = DateTime.UtcNow.AddSeconds(1); - _ = Task.Delay((int)Math.Ceiling(runTime.GetTimespanUntil().TotalMilliseconds), CancellationToken.Token).ContinueWith(x => + _ = LongDelay(runTime.GetTimespanUntil(), CancellationToken).ContinueWith(x => { if (registeredScheduledTasks.ContainsKey(UID)) registeredScheduledTasks.Remove(UID);