Die Bereitstellung von Microsoft.Owin.Hosting.WebApp löst 'System.ObjectDisposedException' aus.

8

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.

    
Helikaon 10.04.2014, 08:09
quelle

1 Antwort

3

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.

%Vor%     
Tim 07.06.2016 17:04
quelle

Tags und Links