still locking up when disposing, because the log callback is trying to write to the...
authorLars Op den Kamp <lars@opdenkamp.eu>
Fri, 13 Dec 2013 10:51:41 +0000 (11:51 +0100)
committerLars Op den Kamp <lars@opdenkamp.eu>
Fri, 13 Dec 2013 10:51:41 +0000 (11:51 +0100)
src/LibCecTray/ui/CECTray.cs

index 197ce32818c0d7537d2349f2f4102ce4b58f0854..021eaa38e55d5d18c2bd89cdabc6036bc8ef6e90 100644 (file)
@@ -41,6 +41,7 @@ using LibCECTray.settings;
 using Microsoft.Win32;
 using System.Security.Permissions;
 using System.Runtime.InteropServices;
+using System.Threading;
 
 namespace LibCECTray.ui
 {
@@ -57,6 +58,21 @@ namespace LibCECTray.ui
     XBMC
   }
 
+  class AsyncDisconnect
+  {
+    public AsyncDisconnect(CECController controller)
+    {
+      _controller = controller;
+    }
+
+    public void Process()
+    {
+      _controller.Close();
+    }
+
+    private CECController _controller;
+  }
+
   /// <summary>
   /// Main LibCecTray GUI
   /// </summary>
@@ -174,11 +190,11 @@ namespace LibCECTray.ui
     protected override void Dispose(bool disposing)
     {
       Hide();
-      SuppressLogUpdates = true;
       if (disposing)
       {
         Controller.CECActions.SuppressUpdates = true;
-        Controller.Close();
+        AsyncDisconnect dc = new AsyncDisconnect(Controller);
+        (new Thread(dc.Process)).Start();
       }
       if (disposing && (components != null))
       {
@@ -312,9 +328,6 @@ namespace LibCECTray.ui
     delegate void UpdateLogCallback();
     private void UpdateLog()
     {
-      if (SuppressLogUpdates)
-        return;
-
       if (tbLog.InvokeRequired)
       {
         UpdateLogCallback d = UpdateLog;
@@ -572,7 +585,6 @@ namespace LibCECTray.ui
     #endregion
 
     #region Class members
-    private bool SuppressLogUpdates = false;
     private ConfigTab _selectedTab = ConfigTab.Configuration;
     private string _log = string.Empty;
     private CECController _controller;