diff --git a/v2rayN/ServiceLib/Helper/DownloaderHelper.cs b/v2rayN/ServiceLib/Helper/DownloaderHelper.cs index 000685a0..907d416f 100644 --- a/v2rayN/ServiceLib/Helper/DownloaderHelper.cs +++ b/v2rayN/ServiceLib/Helper/DownloaderHelper.cs @@ -71,28 +71,25 @@ public class DownloaderHelper } }; - var totalDatetime = DateTime.Now; - var totalSecond = 0; + var lastUpdateTime = DateTime.Now; var hasValue = false; double maxSpeed = 0; await using var downloader = new Downloader.DownloadService(downloadOpt); - //downloader.DownloadStarted += (sender, value) => - //{ - // if (progress != null) - // { - // progress.Report("Start download data..."); - // } - //}; + downloader.DownloadProgressChanged += (sender, value) => { - var ts = DateTime.Now - totalDatetime; - if (progress != null && ts.Seconds > totalSecond) + if (progress != null && value.BytesPerSecondSpeed > 0) { hasValue = true; - totalSecond = ts.Seconds; if (value.BytesPerSecondSpeed > maxSpeed) { maxSpeed = value.BytesPerSecondSpeed; + } + + var ts = DateTime.Now - lastUpdateTime; + if (ts.TotalMilliseconds >= 1000) + { + lastUpdateTime = DateTime.Now; var speed = (maxSpeed / 1000 / 1000).ToString("#0.0"); progress.Report(speed); } @@ -102,10 +99,19 @@ public class DownloaderHelper { if (progress != null) { - if (!hasValue && value.Error != null) + if (hasValue && maxSpeed > 0) + { + var finalSpeed = (maxSpeed / 1000 / 1000).ToString("#0.0"); + progress.Report(finalSpeed); + } + else if (value.Error != null) { progress.Report(value.Error?.Message); } + else + { + progress.Report("0"); + } } }; //progress.Report("......"); diff --git a/v2rayN/ServiceLib/Services/SpeedtestService.cs b/v2rayN/ServiceLib/Services/SpeedtestService.cs index 00f54427..f8cdf5f4 100644 --- a/v2rayN/ServiceLib/Services/SpeedtestService.cs +++ b/v2rayN/ServiceLib/Services/SpeedtestService.cs @@ -323,31 +323,28 @@ public class SpeedtestService(Config config, Func updateF { var responseTime = -1; + if (!IPAddress.TryParse(url, out var ipAddress)) + { + var ipHostInfo = await Dns.GetHostEntryAsync(url); + ipAddress = ipHostInfo.AddressList.First(); + } + + IPEndPoint endPoint = new(ipAddress, port); + using Socket clientSocket = new(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); + + var timer = Stopwatch.StartNew(); try { - if (!IPAddress.TryParse(url, out var ipAddress)) - { - var ipHostInfo = await Dns.GetHostEntryAsync(url); - ipAddress = ipHostInfo.AddressList.First(); - } - - IPEndPoint endPoint = new(ipAddress, port); - using Socket clientSocket = new(endPoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); - - var timer = Stopwatch.StartNew(); - var result = clientSocket.BeginConnect(endPoint, null, null); - if (!result.AsyncWaitHandle.WaitOne(TimeSpan.FromSeconds(5))) - { - throw new TimeoutException("connect timeout (5s): " + url); - } + using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5)); + await clientSocket.ConnectAsync(endPoint, cts.Token).ConfigureAwait(false); + } + catch (OperationCanceledException) + { + } + finally + { timer.Stop(); responseTime = (int)timer.Elapsed.TotalMilliseconds; - - clientSocket.EndConnect(result); - } - catch (Exception ex) - { - Logging.SaveLog(_tag, ex); } return responseTime; }