public void Run()
        {
            var client = new WebClient();
            var rand   = new Random();
            var data   = new byte[DataSize];

            rand.NextBytes(data);
            var results = new BandwidthCheckResult[Tries];

            for (var i = 0; i < Tries; i++)
            {
                try {
                    var stopwatch = new System.Diagnostics.Stopwatch();
                    stopwatch.Start();
                    var response_body = client.UploadData(Target, data);
                    stopwatch.Stop();
                    results[i].ElapsedTime = stopwatch.Elapsed;
                    results[i].Succeeded   = true;
                }
                catch (WebException) {
                    results[i].Succeeded = false;
                }
            }
            if (BandwidthCheckCompleted != null)
            {
                var success         = results.Count(r => r.Succeeded) > 0;
                var average_seconds = results.Average(r => r.ElapsedTime.TotalSeconds);
                BandwidthCheckCompleted(this, new BandwidthCheckCompletedEventArgs(success, DataSize, TimeSpan.FromSeconds(average_seconds)));
            }
        }
        public async Task <BandwidthCheckResult> RunAsync(CancellationToken cancellationToken)
        {
            var result = new BandwidthCheckResult {
                Succeeded   = false,
                DataSize    = 0,
                ElapsedTime = TimeSpan.MaxValue,
            };
            var rand = new Random();
            var data = new byte[250 * 1024];

            rand.NextBytes(data);
            data = CreateChunk(data);
            var stopwatch = new System.Diagnostics.Stopwatch();

            try {
                long sz = 0;
                stopwatch.Start();
                await PostAsync(async (s, ct) => {
                    while (stopwatch.ElapsedMilliseconds < 10000)
                    {
                        await s.WriteBytesAsync(data, ct).ConfigureAwait(false);
                        sz += data.Length;
                    }
                }, cancellationToken).ConfigureAwait(false);

                stopwatch.Stop();
                result.DataSize    = sz;
                result.Succeeded   = true;
                result.ElapsedTime = stopwatch.Elapsed;
            }
            catch (WebException) {
                result.Succeeded = false;
            }
            return(result);
        }
        public void RunAsync()
        {
            var ctx = System.Threading.SynchronizationContext.Current;

            System.Threading.ThreadPool.QueueUserWorkItem(state => {
                var client = new WebClient();
                var rand   = new Random();
                var data   = new byte[DataSize];
                rand.NextBytes(data);
                var results = new BandwidthCheckResult[Tries];
                for (var i = 0; i < Tries; i++)
                {
                    try {
                        var stopwatch = new System.Diagnostics.Stopwatch();
                        stopwatch.Start();
                        var response_body = client.UploadData(Target, data);
                        stopwatch.Stop();
                        results[i].ElapsedTime = stopwatch.Elapsed;
                        results[i].Succeeded   = true;
                    }
                    catch (WebException) {
                        results[i].Succeeded = false;
                    }
                }
                if (BandwidthCheckCompleted != null)
                {
                    var success         = results.Count(r => r.Succeeded) > 0;
                    var average_seconds = results.Average(r => r.ElapsedTime.TotalSeconds);
                    ctx.Post(s => {
                        BandwidthCheckCompleted(
                            this,
                            new BandwidthCheckCompletedEventArgs(success, DataSize, TimeSpan.FromSeconds(average_seconds)));
                    }, null);
                }
            });
        }