Browse Source

tiny refactor

pull/478/head
Gang Zhuo 8 years ago
parent
commit
bd7078aa4f
1 changed files with 18 additions and 16 deletions
  1. +18
    -16
      shadowsocks-csharp/Controller/Service/AvailabilityStatistics.cs

+ 18
- 16
shadowsocks-csharp/Controller/Service/AvailabilityStatistics.cs View File

@@ -167,9 +167,9 @@ namespace Shadowsocks.Controller
records.Add(id, record);
if (Config.Ping)
{
MyPing ping = new MyPing(server, Repeat, record);
MyPing ping = new MyPing(server, Repeat);
ping.Completed += ping_Completed;
ping.Start();
ping.Start(record);
}
}

@@ -181,8 +181,8 @@ namespace Shadowsocks.Controller

private void ping_Completed(object sender, MyPing.CompletedEventArgs e)
{
Server server = ((MyPing)sender).server;
StatisticsRecord record = (StatisticsRecord)((MyPing)sender).userstate;
Server server = e.Server;
StatisticsRecord record = (StatisticsRecord)e.UserState;
record.SetResponse(e.RoundtripTime);
Logging.Debug($"Ping {server.FriendlyName()} {e.RoundtripTime.Count} times, {(100 - record.PackageLoss * 100)}% packages loss, min {record.MinResponse} ms, max {record.MaxResponse} ms, avg {record.AverageResponse} ms");
}
@@ -310,32 +310,30 @@ namespace Shadowsocks.Controller
public const int TimeoutMilliseconds = 500;

public EventHandler<CompletedEventArgs> Completed;
public Server server;
public object userstate;
private Server server;

private int repeat;
private IPAddress ip;
private Ping ping;
private List<int?> RoundtripTime;

public MyPing(Server server, int repeat, object userstate)
public MyPing(Server server, int repeat)
{
this.server = server;
this.repeat = repeat;
this.userstate = userstate;
RoundtripTime = new List<int?>(repeat);
ping = new Ping();
ping.PingCompleted += Ping_PingCompleted;
}

public void Start()
public void Start(object userstate)
{
if (server.server == "")
return;
new Task(() => ICMPTest(0)).Start();
new Task(() => ICMPTest(0, userstate)).Start();
}

private void ICMPTest(int delay)
private void ICMPTest(int delay, object userstate)
{
try
{
@@ -351,7 +349,7 @@ namespace Shadowsocks.Controller
repeat--;
if (delay > 0)
Thread.Sleep(delay);
ping.SendAsync(ip, TimeoutMilliseconds, null);
ping.SendAsync(ip, TimeoutMilliseconds, userstate);
}
catch (Exception e)
{
@@ -374,7 +372,7 @@ namespace Shadowsocks.Controller
Logging.Debug($"Ping {server.FriendlyName()} timeout");
RoundtripTime.Add(null);
}
TestNext();
TestNext(e.UserState);
}
catch (Exception ex)
{
@@ -383,26 +381,30 @@ namespace Shadowsocks.Controller
}
}

private void TestNext()
private void TestNext(object userstate)
{
if (repeat > 0)
{
//Do ICMPTest in a random frequency
int delay = TimeoutMilliseconds + new Random().Next() % TimeoutMilliseconds;
new Task(() => ICMPTest(delay)).Start();
new Task(() => ICMPTest(delay, userstate)).Start();
}
else
{
Completed?.Invoke(this, new CompletedEventArgs
{
RoundtripTime = RoundtripTime
Server = server,
RoundtripTime = RoundtripTime,
UserState = userstate
});
}
}

public class CompletedEventArgs : EventArgs
{
public Server Server;
public List<int?> RoundtripTime;
public object UserState;
}
}



Loading…
Cancel
Save