From 3f9a44e30698b2c264cabadb65e4998a6735ef32 Mon Sep 17 00:00:00 2001 From: Turnerj Date: Mon, 31 Dec 2018 15:38:06 +1030 Subject: [PATCH] Fixes issues around delaying tasks affecting timers --- src/InfinityCrawler/ParallelAsyncTask.cs | 36 ++++++++++++++++-------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/src/InfinityCrawler/ParallelAsyncTask.cs b/src/InfinityCrawler/ParallelAsyncTask.cs index 596d025..341a44d 100644 --- a/src/InfinityCrawler/ParallelAsyncTask.cs +++ b/src/InfinityCrawler/ParallelAsyncTask.cs @@ -36,9 +36,19 @@ ParallelAsyncTaskOptions options { if (itemsToProcess.TryDequeue(out var item)) { - var task = action(item, itemsToProcess); + var taskStartDelay = 0d; + //Task delaying and backoff + if (options.DelayBetweenTaskStart.TotalMilliseconds > 0) + { + taskStartDelay = options.DelayBetweenTaskStart.TotalMilliseconds; + taskStartDelay += random.NextDouble() * options.DelayJitter.TotalMilliseconds; + } + + taskStartDelay += currentBackoff; + var timer = new Stopwatch(); - timer.Start(); + var task = RunAction(item, action, itemsToProcess, (int)taskStartDelay, timer); + activeTasks.TryAdd(task, timer); taskCount++; @@ -49,15 +59,6 @@ ParallelAsyncTaskOptions options return; } - //Task delaying and backoff - if (options.DelayBetweenTaskStart.TotalMilliseconds > 0) - { - var taskStartDelay = options.DelayBetweenTaskStart.TotalMilliseconds; - taskStartDelay += random.NextDouble() * options.DelayJitter.TotalMilliseconds; - taskStartDelay += currentBackoff; - Thread.Sleep((int)taskStartDelay); - } - if (activeTasks.Count == options.MaxNumberOfSimultaneousTasks) { break; @@ -84,6 +85,7 @@ ParallelAsyncTaskOptions options { successesSinceLastThrottle = 0; currentBackoff += (int)options.ThrottlingRequestBackoff.TotalMilliseconds; + Console.WriteLine($"New backoff: {currentBackoff}ms"); } else if (currentBackoff > 0) { @@ -93,11 +95,23 @@ ParallelAsyncTaskOptions options var newBackoff = currentBackoff - options.ThrottlingRequestBackoff.TotalMilliseconds; currentBackoff = Math.Max(0, (int)newBackoff); successesSinceLastThrottle = 0; + Console.WriteLine($"New backoff: {currentBackoff}ms"); } } } } } + + private static async Task RunAction(TModel item, Func, Task> action, ConcurrentQueue itemsToProcess, int delay, Stopwatch timer) + { + if (delay > 0) + { + await Task.Delay(delay); + } + timer.Start(); + await action(item, itemsToProcess); + timer.Stop(); + } } public class ParallelAsyncTaskOptions