Wir haben einen selbst gehosteten SignalR-Server in unserer WPF-Anwendung. Die WebApp wird beim Start der Anwendung gestartet. Beim Application-Exit verfügen wir über die WebApp.
%Vor%Der Aufruf von myWebApp.Dispose () löst eine 'System.ObjectDisposedException' aus. Mache ich etwas falsch? Die Microsoft.Owin. * DLLs haben die Version 2.1.0 und den SignalR-Selbsthost 2.0.3
UPDATE : Es stellt sich heraus, dass dies die erste Ausnahme ist, die ich in Visual Studio sehen kann, weil die Einstellung "break on clr exceptions" aktiv ist. Diese Ausnahme scheint intern behandelt zu werden und dringt nicht in unseren Code ein.
Nachdem ich den Katana Quellcode erkundet habe, habe ich einen Grund für dieses Problem gefunden. Es ist die Methode Microsoft.Owin.Host.HttpListener.OwinHttpListener.ProcessRequestsAsync()
. Es startet die while-Schleife mit dem _listener.GetContextAsync()
-Aufruf einer privaten HttpListener
-Instanz im try-catch-Abschnitt.
Auch die Klasse implementiert IDisposable
und enthält eine Dispose()
-Methode. Diese Methode verfügt über die private Instanz HttpListener
.
Wenn Sie WebApp.Start()
aufrufen, wird eine Instanz von IDisposable
zurückgegeben, die nur Dispose()
method hat, die OwinHttpListener
. disposed.
Also, wenn Sie es entsorgen, rufen Sie seine Dispose()
-Methode von OwinHttpListener
auf, die die private HttpListener
enthält.
Aber gleichzeitig ruft ProcessRequestsAsync()
_listener.GetContextAsync()
auf, aber _listener
ist bereits entsorgt und wirft ObjectDisposedException
. catch
block protokolliert die Ausnahme und gibt von ProcessRequestsAsync()
zurück.
Ich denke, dass Double Check Lock in ProcessRequestsAsync()
eine gute Option sein kann.