Esempio n. 1
0
        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
            });
        }
Esempio n. 2
0
 internal static void DrawGrades(AgentRequestGrade grades)
 {
     Console.WriteLine(GradesResultString,
                       grades.Passed,
                       grades.Failed,
                       grades.Undefined);
 }