我正在开发一个有 HttpListener
的应用 . 我的目标是让用户在他们选择时关闭和打开监听器 . 我把Listener放在一个新线程中,我遇到了一个问题,就是在中止该线程 . 我读到某个地方,如果你试图中止一个处于非托管上下文中的线程,那么只要它重新进入托管上下文,就会触发 ThreadAbortException
. 似乎HttpListener的 GetContext()
方法是不受管理的,因为当我尝试中止线程时,在我针对我的应用程序发出Web请求之前没有任何事情发生 . 然后线程退出 . 问题是当我试图杀死线程时,我可能稍后在同一端口再次启动线程,并且 HttpListenerException
说明前缀已经注册 .
我怎么能杀死一个交叉线程HttpListener?是否有一个托管替代 GetContext()
将允许线程中止?我可以以非托管代码停止的方式中止线程吗?
3 回答
你需要通知线程调用HttpListener.Stop()并通过调用Thread.Join()等待线程完成
怎么样的:
用法:
您需要做的就是在监听器上调用stop . 由于您的侦听器线程在
GetContext
上被阻止,因此您需要在另一个线程上执行此操作 . IIRC这将导致GetContext
抛出,因此您将需要处理该异常并进行清理 . 调用Thread.Abort
应该是你的最后手段,并且不会导致监听器停止监听,直到它被垃圾收集为止 .