using System.IO;\r
using System.Net;\r
using System.Net.Sockets;\r
-using System.Threading;\r
-using System.Threading.Tasks;\r
using System.Windows.Forms;\r
using Microsoft.Win32;\r
\r
private readonly Control _parent;\r
private readonly SystemProxy _systemProxy = new SystemProxy();\r
private int _prevProxyPort;\r
+ private readonly Timer _periodicTimer = new Timer { Interval = 1000 };\r
\r
public ProxyManager(Config config, Control parent)\r
{\r
_config = config;\r
_parent = parent;\r
SystemEvents.PowerModeChanged += SystemEvents_PowerModeChanged;\r
+ _periodicTimer.Tick += PeriodicalCheck;\r
}\r
\r
public bool ApplyConfig()\r
}\r
if (_config.Proxy.Auto && result)\r
{\r
- SetAutoProxyUrl();\r
+ SetAndCheckAutoConfigUrl();\r
}\r
_prevProxyPort = _config.Proxy.Listen;\r
return result;\r
\r
public void Shutdown()\r
{\r
- Task.Run(() => ShutdownProxy());\r
+ ShutdownProxy();\r
if (_config.Proxy.Auto)\r
RestoreSystemProxy();\r
SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;\r
HttpProxy.Shutdown();\r
}\r
\r
- private readonly AutoResetEvent _stopEvent = new AutoResetEvent(false);\r
- private Task _checkerTask;\r
+ private void SetAndCheckAutoConfigUrl()\r
+ {\r
+ SetAutoConfigUrl();\r
+ _periodicTimer.Start();\r
+ }\r
\r
- private void SetAutoProxyUrl()\r
+ // Windows 10でプロキシ設定がいつの間にか消えるのに対応するために、\r
+ // 設定が消えていないか毎秒確認して、消えていたら再設定する。\r
+ private void PeriodicalCheck(object sender, EventArgs ev)\r
{\r
- var url = $"http://localhost:{_config.Proxy.Listen}/proxy.pac";\r
- _systemProxy.SetAutoConfigUrl(url);\r
- if (_checkerTask != null && !_checkerTask.IsCompleted)\r
- {\r
- _stopEvent.Set();\r
- _checkerTask.Wait();\r
- }\r
- _checkerTask = Task.Run(() =>\r
- {\r
- // Windows 10でプロキシ設定がいつの間にか消えるのに対応するために、\r
- // 設定が消えていないか毎秒確認して、消えていたら再設定する。\r
- do\r
- {\r
- var proxy = WebRequest.GetSystemWebProxy().GetProxy(new Uri("http://125.6.184.16/"));\r
- if (!proxy.IsLoopback)\r
- {\r
- File.AppendAllText("proxy.log", $"[{DateTime.Now:g}] proxy setting vanished.\r\n");\r
- _systemProxy.SetAutoConfigUrl(url);\r
- }\r
- } while (!_stopEvent.WaitOne(1000));\r
- });\r
+ if (IsProxyWorking)\r
+ return;\r
+ File.AppendAllText("proxy.log", $"[{DateTime.Now:g}] proxy setting vanished.\r\n");\r
+ SetAutoConfigUrl();\r
}\r
\r
+ private bool IsProxyWorking =>\r
+ WebRequest.GetSystemWebProxy().GetProxy(new Uri("http://125.6.184.16/")).IsLoopback;\r
+\r
+ private void SetAutoConfigUrl() =>\r
+ _systemProxy.SetAutoConfigUrl($"http://localhost:{_config.Proxy.Listen}/proxy.pac");\r
+\r
private void RestoreSystemProxy()\r
{\r
- if (_checkerTask != null && !_checkerTask.IsCompleted)\r
- {\r
- _stopEvent.Set();\r
- _checkerTask.Wait();\r
- }\r
+ _periodicTimer.Stop();\r
_systemProxy.RestoreSettings();\r
}\r
\r