/// <summary> /// Initializes a thread and starts pinging the specified server /// Calculates the ping and delta of each ping in ms /// </summary> public void StartPing(int numberOfPings) { _isRunning = true; _totalTime = 0; IAsyncAction _pingAction = ThreadPool.RunAsync(async workItem => { var previousPingTime = 0; var delta = 0; var pingIteration = 1; while (pingIteration <= numberOfPings && _isRunning) { var stopwatch = new Stopwatch(); var socket = new StreamSocket(); stopwatch.Start(); try { await socket.ConnectAsync(new HostName(_url), "80"); } catch (Exception e) { OnThreadFinished(FinishType.ERROR); OnThreadFinished(FinishType.FINISHED); return; } stopwatch.Stop(); var ms = (int)stopwatch.ElapsedMilliseconds; // First time there is no delta if (pingIteration > 0) { delta = Math.Abs(ms - previousPingTime); previousPingTime = ms; } Interlocked.Add(ref _totalTime, ms + delta); HorseProgressEventArgs horseProgressEventArgs = new HorseProgressEventArgs(_totalTime, pingIteration); OnPingReceived(horseProgressEventArgs); Thread.Sleep(1000); pingIteration++; } if (!_isRunning) { OnThreadFinished(FinishType.CANCELED); return; } OnThreadFinished(FinishType.FINISHED); }); }
/// <summary> /// Event triggers whenever a ping is finished /// </summary> /// <param name="e"></param> protected virtual void OnPingReceived(HorseProgressEventArgs e) { EventHandler <HorseProgressEventArgs> handler = PingReceived; handler?.Invoke(this, e); }