问题:http关闭后,task估计还在运行,断点打不到, 异常信息:System.Net.HttpListenerException (0x80004005): 由于线程退出或应用 程序请求,已中止 I/O 操作。在 System.Net.HttpListener.GetContext() 代码: 方法调用 static void Main(string[]args){ HttpServer.Start(); Thread.Sleep(2000); HttpServer.Stop(); Console.ReadKey(); } public class HttpServer{ private static HttpListener httpListener; private static CancellationTokenSource cancelToken; public static void Start(){ httpListener = new HttpListener(); httpListener.Prefixes.Add("http://+:8048/"); httpListener.Start(); cancelToken = new CancellationTokenSource(); Task.Run(() => { handlehttp(); }, cancelToken.Token); } public static void Stop(){ httpListener.Stop(); httpListener.Close(); cancelToken.Cancel(); } private void handlehttp(){ while(true){ try{ if (cancelToken.IsCancellationRequested) { break; } if(!httpListener.IsListening){break;} var context = httpListener.GetContext();//结束这句一直报错 }catch(Exception ex){ } } } }
public static void Stop(){ 这里赋值 httpListener=null
handlehttp 检查httpListener空的话直接返回应该就行了吧
过不了哈,httpListener.GetContext()这个引发的,没有再次出现循环,昨天试了net core 的 task,也有问题,线程没有停止,使用thread的话,没有实现abort方法,net 5 也是报上面的错,3.1好像不会报错,但task线程不会停止
@apgk: httpListener如果已经无效了,httpListener.GetContext()这个肯定出问题的
如果是并发的话,Stop和handlehttp需要处理下同步,一定要控制销毁httpListener后不能在handlehttp对它进行操作了
@2012: handlehttp本身没有任何操作,只是等待接入而已,但目前就是getcontext()先抛出异常,这里一直等待监听的,其实是想看下httpListener 停止后,getcontext()为啥出个异常,net4.5 使用thread ,那么 getcontext()捕捉 threadabortexception 就没有 httplistenerexception错误,真的很神奇的一幕。
@apgk: stop工作在另一个线程,handlehttp工作在一个线程。 stop中httpListener.Close将httpListener这个资源销毁了,httpListener.getcontext调用自然是有问题的
net4.5 使用thread,此时触发了threadabortexception,而这个异常的层次 https://docs.microsoft.com/zh-cn/dotnet/api/system.threading.threadabortexception?redirectedfrom=MSDN&view=net-5.0
集成于Exception,相当于catch到了,这样程序就相当于忽略了这个异常
@2012: 你试试就知道了,使用thread 不会抛出httplistenerexception 这个异常,thread abort肯定会触发threadabortexception,我知道的,上面代码net 都会跑错,net core 不会(线程应该没结束),net core 未实现 thread abort,所以线程无法停止,你试试就知道了。