今天,我正在编写一个使用
.NET Framework 4.8
的框架。我的代码中有一个HttpListener
,用于从目标网站获取消息,代码运行良好。但是,当我启动侦听器并立即停止它时,它向我显示了 ObjectDisposedException
错误。在这种情况下,我尝试使用单步调试,有趣的是没有任何错误。
在这种情况下,我尝试删除一些代码,这是最小的可重现代码:
HttpListener httpListener = new HttpListener();
httpListener.Start();
httpListener.Stop();
当我运行它时,它会在第3行(
ObjectDisposedException
)显示httpListener.Stop();
错误,如果你对代码进行堆栈跟踪,它会显示错误将发生在SafeHandle.cs
的第150行:
throw new ObjectDisposedException(nameof(SafeHandle), SR.ObjectDisposed_SafeHandleClosed);
但是,如果不花费大量时间,我就无法理解那么多代码、发生了什么以及导致该错误的原因,所以我想知道为什么会发生这种情况。
不幸的是我没有真正的解释,但是如果你看一下源代码,你可以看到Stop()方法调用CheckDispose(),它抛出给定的异常,当m_State==State.Closed时。通过调用此值的方法来显式设置状态的唯一方法是方法 Abort() 和 Dispose()。另外,SetupV2Config()和Start()中的异常可以强制执行此状态,但也会在几行后抛出。
所以这不是您问题的“真正答案”。但至少它显示了何时可能发生此错误,并且也许其他人能够“深入挖掘”或更好地解释为什么使用给定信息会发生此错误。