【发布时间】:2013-06-01 12:49:52
【问题描述】:
我正在开发一个具有HttpListener 的应用程序。我的目标是让用户根据自己的选择关闭和打开监听器。我将侦听器放在一个新线程中,但在中止该线程时遇到问题。我在某处读到,如果您尝试中止处于非托管上下文中的线程,那么一旦它重新进入托管上下文,ThreadAbortException 就会被触发。似乎 HttpListener 的 GetContext() 方法是不受管理的,因为当我尝试中止线程时,在我对我的应用程序发出 Web 请求之前什么都没有发生。然后线程退出。问题是当我尝试终止线程时,我可能稍后在同一个端口上再次启动该线程,然后HttpListenerException 熄灭,表示前缀已注册。
我怎样才能杀死一个跨线程的HttpListener? GetContext() 是否有可管理的替代方案允许线程中止?我可以以非托管代码停止的方式中止线程吗?
【问题讨论】:
-
如果可能,使用 BeginGetContext() 和 EndGetContext() 实现您的 HttpListener
-
您能否发布一些代码,显示您如何启动线程等? - 您可能可以在某处潜入
CancellationToken,并且每当用户“关闭”监听器时,您可以在CancellationToken上调用Cancel方法——它有一个延续,表示它应该调用HttpListener.Stop()。
标签: c# multithreading httplistener