diff --git a/shadowsocks-csharp/Controller/Service/AvailabilityStatistics.cs b/shadowsocks-csharp/Controller/Service/AvailabilityStatistics.cs index d7b52733..d3a7ecce 100644 --- a/shadowsocks-csharp/Controller/Service/AvailabilityStatistics.cs +++ b/shadowsocks-csharp/Controller/Service/AvailabilityStatistics.cs @@ -17,8 +17,7 @@ namespace Shadowsocks.Controller using DataUnit = KeyValuePair; using DataList = List>; - using RawStatistics = Dictionary>; - using Statistics = Dictionary>; + using Statistics = Dictionary>; public class AvailabilityStatistics { @@ -27,11 +26,11 @@ namespace Shadowsocks.Controller private const string Delimiter = ","; private const int Timeout = 500; private const int DelayBeforeStart = 1000; - public RawStatistics rawStatistics { get; private set; } - public RawStatistics filteredStatistics { get; private set; } - private int _repeat => _config.RepeatTimesNum; + public Statistics RawStatistics { get; private set; } + public Statistics FilteredStatistics { get; private set; } + private int Repeat => _config.RepeatTimesNum; private const int RetryInterval = 2*60*1000; //retry 2 minutes after failed - private int _interval => (int) TimeSpan.FromMinutes(_config.DataCollectionMinutes).TotalMilliseconds; + private int Interval => (int) TimeSpan.FromMinutes(_config.DataCollectionMinutes).TotalMilliseconds; private Timer _timer; private State _state; private List _servers; @@ -58,10 +57,10 @@ namespace Shadowsocks.Controller { if (config.StatisticsEnabled) { - if (_timer?.Change(DelayBeforeStart, _interval) == null) + if (_timer?.Change(DelayBeforeStart, Interval) == null) { _state = new State(); - _timer = new Timer(run, _state, DelayBeforeStart, _interval); + _timer = new Timer(Run, _state, DelayBeforeStart, Interval); } } else @@ -118,12 +117,12 @@ namespace Shadowsocks.Controller var ping = new Ping(); var ret = new List(); foreach ( - var timestamp in Enumerable.Range(0, _repeat).Select(_ => DateTime.Now.ToString(DateTimePattern))) + var timestamp in Enumerable.Range(0, Repeat).Select(_ => DateTime.Now.ToString(DateTimePattern))) { //ICMP echo. we can also set options and special bytes try { - var reply = ping.Send(IP, Timeout); + var reply = await ping.SendTaskAsync(IP, Timeout); ret.Add(new List> { new KeyValuePair("Timestamp", timestamp), @@ -132,7 +131,7 @@ namespace Shadowsocks.Controller new KeyValuePair("RoundtripTime", reply?.RoundtripTime.ToString()) //new KeyValuePair("data", reply.Buffer.ToString()); // The data of reply }); - Thread.Sleep(new Random().Next() % Timeout); + Thread.Sleep(Timeout + new Random().Next() % Timeout); //Do ICMPTest in a random frequency } catch (Exception e) @@ -144,7 +143,7 @@ namespace Shadowsocks.Controller return ret; } - private void run(object obj) + private void Run(object obj) { LoadRawStatistics(); FilterRawStatistics(); @@ -197,11 +196,11 @@ namespace Shadowsocks.Controller private void FilterRawStatistics() { - if (filteredStatistics == null) + if (FilteredStatistics == null) { - filteredStatistics = new RawStatistics(); + FilteredStatistics = new Statistics(); } - foreach (IEnumerable rawData in rawStatistics.Values) + foreach (IEnumerable rawData in RawStatistics.Values) { var filteredData = rawData; if (_config.ByIsp) @@ -232,7 +231,7 @@ namespace Shadowsocks.Controller } var dataList = filteredData as List ?? filteredData.ToList(); var serverName = dataList[0].ServerName; - filteredStatistics[serverName] = dataList; + FilteredStatistics[serverName] = dataList; } } @@ -245,10 +244,10 @@ namespace Shadowsocks.Controller if (!File.Exists(path)) { Console.WriteLine($"statistics file does not exist, try to reload {RetryInterval/60/1000} minutes later"); - _timer.Change(RetryInterval, _interval); + _timer.Change(RetryInterval, Interval); return; } - rawStatistics = (from l in File.ReadAllLines(path) + RawStatistics = (from l in File.ReadAllLines(path) .Skip(1) let strings = l.Split(new[] {","}, StringSplitOptions.RemoveEmptyEntries) let rawData = new RawStatisticsData