private void CallbackServer(List <Object_Server> servers, Action <object[]> callback) { var tmpList = CloneObjectServers(servers); Parallel.ForEach(tmpList, server => { try { if (IsOver || ctsSwitch.Token.IsCancellationRequested) { return; } RefreshServerList(4, server); var obj = new Object_IP() { Ip = server.Ip }; obj.HttpSetSpeed(); if (!obj.IsNotValid && !obj.IsForbidden) { obj.HttpSetSpeed(); } var o = new object[2]; o[0] = server; o[1] = obj; callback(o); } catch { } }); }
/// <summary> /// 切换服务器 /// </summary> /// <param name="objp">切换前的服务器</param> /// <param name="callback">切换后的服务器</param> /// <param name="flag">是否为手动切换</param> private void ServerSwitch(CancellationToken token, Object_IP objp, Action <Object_IP> callback, bool flag = false) { DeterMineCall(() => { if (flag) { objp.HttpSetSpeed(); switchSeed++; if (objp.Speed != null) { hostAction.AddDnsResolve(objp.Ip, domain); callback(objp); } } else { if (dnsListTmp.Count <= 0) { AddSwitchListViewItem("没有可用的服务器,请重启关闭本窗口重新启动并测试。", Color.Red, ""); ctsListen.Cancel(); ctsSwitch.Cancel(); return; } for (int i = switchSeed; i < dnsListTmp.Count; i++) { if (token.IsCancellationRequested) { return; } objp.Ip = dnsListTmp[i].Ip; objp.HttpSetSpeed(); switchSeed++; if (objp.Speed != null) { hostAction.AddDnsResolve(objp.Ip, domain); callback(objp); break; } } if (objp.Speed != null) { AddSwitchListViewItem("切换完成 [{0}] ,响应速度={1}秒", Color.Green, new object[] { objp.Ip, objp.Speed.Value.TotalSeconds.ToString("#0.00") }); } } }); }
/// <summary> /// /// </summary> /// <param name="objp">手动切换的IP对象,自动切换请置空</param> /// <param name="callback"></param> /// <param name="flag">手否是手动切换</param> public void AutoSwitchCDN(Object_IP objp, Action <string> callback, bool flag = false) { if (_index == -1) { _index = 0; } if (flag) { objp.HttpSetSpeed(); //if (objp.Speed != null) //{ hostAction.AddDnsResolve(objp.Ip, _domain); callback(string.Format("自动切换完成 [{0}]", objp.Ip)); //} } else { if (CDN_List.Count <= 0) { callback("没有可以切换的服务器..."); return; } for (int i = _index; i < CDN_List.Count; i++) { var obj = new Object_IP(); obj.Ip = CDN_List[i].Ip; //obj.HttpSetSpeed(); _index++; //if (obj.Speed != null) //{ hostAction.AddDnsResolve(obj.Ip, _domain); callback(string.Format("自动切换完成 [{0}] ", obj.Ip)); break; //} } if (_index >= CDN_List.Count / 2) { _index = 0; } } }
/// <summary> /// /// </summary> /// <param name="objp">手动切换的IP对象,自动切换请置空</param> /// <param name="callback"></param> /// <param name="flag">手否是手动切换</param> public void AutoSwitchCDN(Object_IP objp, Action<string> callback, bool flag = false) { if (_index == -1) _index = 0; if (flag) { objp.HttpSetSpeed(); //if (objp.Speed != null) //{ hostAction.AddDnsResolve(objp.Ip, _domain); callback(string.Format("自动切换完成 [{0}]", objp.Ip)); //} } else { if (CDN_List.Count <= 0) { callback("没有可以切换的服务器..."); return; } for (int i = _index; i < CDN_List.Count; i++) { var obj = new Object_IP(); obj.Ip = CDN_List[i].Ip; //obj.HttpSetSpeed(); _index++; //if (obj.Speed != null) //{ hostAction.AddDnsResolve(obj.Ip, _domain); callback(string.Format("自动切换完成 [{0}] ", obj.Ip)); break; //} } if (_index >= CDN_List.Count/2) _index = 0; } }
/// <summary> /// 监听方法 /// </summary> private void ListenMethod(object token) { var ct = (CancellationToken)token; if (ct.IsCancellationRequested) { return; } lock (locker) { var localhost = new Object_IP(); string hostLine = hostAction.GetCacheServerIP(domain); if (ipAddress != null) { localhost.Ip = ipAddress.ToString(); ipAddress = null; } else { localhost.Ip = hostLine == "" ? domain : hostLine.Replace(" " + domain, ""); } localhost.HttpSetSpeed(); hostAction.AddDnsResolve(localhost.Ip, domain); if (localhost.Speed == null) { timeOutCount++; if (timeOutCount + lowCount < 2) { AddSwitchListViewItem("服务器 [{0}] 操作超时,已记录 [{1}] 次,连续累计超时或过慢2次则进行切换...", Color.FromArgb(192, 0, 192), localhost.Ip, timeOutCount + lowCount); } else { AddSwitchListViewItem("服务器 [{0}] 操作超时,正在切换...", Color.FromArgb(192, 0, 192), localhost.Ip); ServerSwitch(ct, localhost, (obj) => localhost = obj); timeOutCount = 0; } } else { if (localhost.Speed.Value.TotalSeconds > 1)//小于1秒,为正常速度 { lowCount++; if (timeOutCount + lowCount < 3) { AddSwitchListViewItem("服务器 [{0}] 速度过慢,响应速度={1}秒,已记录 [{2}] 次,连续累计超时或过慢3次则进行切换...", Color.FromArgb(192, 0, 192), localhost.Ip, localhost.Speed.Value.TotalSeconds.ToString("#0.00"), timeOutCount + lowCount); } else { AddSwitchListViewItem("服务器 [{0}] 速度过慢,响应速度={1}秒,正在切换...", Color.FromArgb(192, 0, 192), localhost.Ip, localhost.Speed.Value.TotalSeconds.ToString("#0.00")); ServerSwitch(ct, localhost, (obj) => localhost = obj); lowCount = 0; } } else { AddSwitchListViewItem("服务器 [{0}] 正常,响应速度={1}秒", Color.Green, localhost.Ip, localhost.Speed.Value.TotalSeconds.ToString("#0.00")); timeOutCount = 0; lowCount = 0; } } } Thread.Sleep(10000); ListenMethod(token); }
/// <summary> /// 切换服务器 /// </summary> /// <param name="objp">切换前的服务器</param> /// <param name="callback">切换后的服务器</param> /// <param name="flag">是否为手动切换</param> private void ServerSwitch(CancellationToken token, Object_IP objp, Action<Object_IP> callback,bool flag=false) { DeterMineCall(() => { if (flag) { objp.HttpSetSpeed(); switchSeed++; if (objp.Speed != null) { hostAction.AddDnsResolve(objp.Ip, domain); callback(objp); } } else { if (dnsListTmp.Count <= 0) { AddSwitchListViewItem("没有可用的服务器,请重启关闭本窗口重新启动并测试。", Color.Red, ""); ctsListen.Cancel(); ctsSwitch.Cancel(); return; } for (int i = switchSeed; i < dnsListTmp.Count; i++) { if (token.IsCancellationRequested) { return; } objp.Ip = dnsListTmp[i].Ip; objp.HttpSetSpeed(); switchSeed++; if (objp.Speed != null) { hostAction.AddDnsResolve(objp.Ip, domain); callback(objp); break; } } if (objp.Speed != null) { AddSwitchListViewItem("切换完成 [{0}] ,响应速度={1}秒", Color.Green, new object[] { objp.Ip, objp.Speed.Value.TotalSeconds.ToString("#0.00") }); } } }); }
/// <summary> /// 监听方法 /// </summary> private void ListenMethod(object token) { var ct = (CancellationToken)token; if (ct.IsCancellationRequested) { return; } lock (locker) { var localhost = new Object_IP(); string hostLine = hostAction.GetCacheServerIP(domain); if (ipAddress != null) { localhost.Ip = ipAddress.ToString(); ipAddress = null; } else { localhost.Ip = hostLine == "" ? domain : hostLine.Replace(" " + domain, ""); } localhost.HttpSetSpeed(); hostAction.AddDnsResolve(localhost.Ip, domain); if (localhost.Speed == null) { timeOutCount++; if (timeOutCount + lowCount < 2) { AddSwitchListViewItem("服务器 [{0}] 操作超时,已记录 [{1}] 次,连续累计超时或过慢2次则进行切换...", Color.FromArgb(192, 0, 192), localhost.Ip, timeOutCount + lowCount); } else { AddSwitchListViewItem("服务器 [{0}] 操作超时,正在切换...", Color.FromArgb(192, 0, 192), localhost.Ip); ServerSwitch(ct, localhost, (obj) => localhost = obj); timeOutCount = 0; } } else { if (localhost.Speed.Value.TotalSeconds > 1)//小于1秒,为正常速度 { lowCount++; if (timeOutCount + lowCount < 3) { AddSwitchListViewItem("服务器 [{0}] 速度过慢,响应速度={1}秒,已记录 [{2}] 次,连续累计超时或过慢3次则进行切换...", Color.FromArgb(192, 0, 192), localhost.Ip, localhost.Speed.Value.TotalSeconds.ToString("#0.00"), timeOutCount + lowCount); } else { AddSwitchListViewItem("服务器 [{0}] 速度过慢,响应速度={1}秒,正在切换...", Color.FromArgb(192, 0, 192), localhost.Ip, localhost.Speed.Value.TotalSeconds.ToString("#0.00")); ServerSwitch(ct, localhost, (obj) => localhost = obj); lowCount = 0; } } else { AddSwitchListViewItem("服务器 [{0}] 正常,响应速度={1}秒", Color.Green, localhost.Ip, localhost.Speed.Value.TotalSeconds.ToString("#0.00")); timeOutCount = 0; lowCount = 0; } } } Thread.Sleep(10000); ListenMethod(token); }
private void CallbackServer(List<Object_Server> servers, Action<object[]> callback) { var tmpList = CloneObjectServers(servers); Parallel.ForEach(tmpList, server => { try { if (IsOver || ctsSwitch.Token.IsCancellationRequested) return; RefreshServerList(4, server); var obj = new Object_IP() {Ip = server.Ip}; obj.HttpSetSpeed(); if (!obj.IsNotValid && !obj.IsForbidden) obj.HttpSetSpeed(); var o = new object[2]; o[0] = server; o[1] = obj; callback(o); } catch { } }); }