public async Task <AgentResult> Run(int threads, CancellationToken cancellationToken) { var flattenedTree = Flatten(_requestTree.Requests); var results = new List <AgentThreadResult>(); var sw = new Stopwatch(); sw.Start(); // flatten the tree and "do the work" foreach (var requests in flattenedTree) { if (cancellationToken.IsCancellationRequested) { break; } // manage the number of threads with TPL Dataflow var throttler = new TransformBlock <IAgentJob, AgentThreadResult>( async job => await job.DoWork().ConfigureAwait(false), new ExecutionDataflowBlockOptions { MaxDegreeOfParallelism = threads, CancellationToken = cancellationToken } ); var buffer = new BufferBlock <AgentThreadResult>(); throttler.LinkTo(buffer); var jobSet = requests.Select(r => { return(new HttpClientAgentJob(_client, r)); }); foreach (var job in jobSet) { throttler.Post(job); } throttler.Complete(); await throttler.Completion.ConfigureAwait(false); IList <AgentThreadResult> processed; buffer.TryReceiveAll(out processed); results.AddRange(processed); } // compile results var combinedThreadResult = new CombinedAgentThreadResult(results, sw.Elapsed); var statsResult = new AgentStats(threads); statsResult.Process(combinedThreadResult); var gradsResult = new AgentRequestGrade(_comparerFactory); gradsResult.Process(results); return(new AgentResult { Stats = statsResult, Grades = gradsResult }); }
internal static void DrawGrades(AgentRequestGrade grades) { Console.WriteLine(GradesResultString, grades.Passed, grades.Failed, grades.Undefined); }