OSDN Git Service

プロキシ設定の確認をTaskで行うのをやめる
authorKazuhiro Fujieda <fujieda@users.osdn.me>
Fri, 10 Nov 2017 10:41:59 +0000 (19:41 +0900)
committerKazuhiro Fujieda <fujieda@users.osdn.me>
Sat, 27 Jan 2018 08:33:53 +0000 (17:33 +0900)
KancolleSniffer/ProxyManager.cs

index c57b195..364569d 100644 (file)
@@ -16,8 +16,6 @@ using System;
 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
@@ -29,12 +27,14 @@ namespace KancolleSniffer
         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
@@ -55,7 +55,7 @@ namespace KancolleSniffer
             }\r
             if (_config.Proxy.Auto && result)\r
             {\r
-                SetAutoProxyUrl();\r
+                SetAndCheckAutoConfigUrl();\r
             }\r
             _prevProxyPort = _config.Proxy.Listen;\r
             return result;\r
@@ -106,7 +106,7 @@ namespace KancolleSniffer
 \r
         public void Shutdown()\r
         {\r
-            Task.Run(() => ShutdownProxy());\r
+            ShutdownProxy();\r
             if (_config.Proxy.Auto)\r
                 RestoreSystemProxy();\r
             SystemEvents.PowerModeChanged -= SystemEvents_PowerModeChanged;\r
@@ -117,41 +117,31 @@ namespace KancolleSniffer
             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