Explorar el Código

Fix deadlock in background translation thread shutdown (#7239)

TryDequeue checks for _disposed before taking the lock.  If another
thread calls Dispose before it takes the lock, it won't get woken up by
the PulseAll call, and will deadlock in Monitor.Wait.

Double-checking _disposed with the lock taken should avoid this.
David McFarland hace 1 año
padre
commit
3c61d560c3
Se han modificado 1 ficheros con 4 adiciones y 1 borrados
  1. 4 1
      src/ARMeilleure/Translation/TranslatorQueue.cs

+ 4 - 1
src/ARMeilleure/Translation/TranslatorQueue.cs

@@ -80,7 +80,10 @@ namespace ARMeilleure.Translation
                         return true;
                     }
 
-                    Monitor.Wait(Sync);
+                    if (!_disposed)
+                    {
+                        Monitor.Wait(Sync);
+                    }
                 }
             }