使用HttpListener循环接收请求是否丢消息及多监听前缀问题
HttpListener异步模式与并发请求疑问解答
疑问1:BeginGetContext调用间隙是否会遗漏消息?
我担心两次BeginGetContext调用间存在间隙导致消息遗漏,大量并发请求是否会被忽略?首次使用AsyncCallback/IAsyncResult模式及HttpListener,代码如下:
Task.Run(() => { while (!CTok.IsCancellationRequested && listener.IsListening) { IAsyncResult result = listener.BeginGetContext(new AsyncCallback(DoWork), listener); result.AsyncWaitHandle.WaitOne(); } });
private void DoWork(IAsyncResult willResult) { HttpListener listener = (HttpListener)willResult.AsyncState!; // 调用EndGetContext完成异步操作 HttpListenerContext context = listener.EndGetContext(willResult); // 在此处执行实际工作,比如解析内容、构建响应 }
疑问2:多个重叠前缀的HttpListener触发回调数量?
另外,若运行多个监听前缀可处理同一URI(如http://*.foo.com/和http://*.com/)的HttpListener,会有几个触发AsyncCallback?
疑问3:await/async模式循环是否会丢失请求?
后续改用await/async模式:
Task.Run(async () => { while (!CTok.IsCancellationRequested && StartedHttpListener.IsListening) { var ctx = await StartedHttpListener.GetContextAsync(); _ = Task.Run(()=>Handler(ctx,CTok), CTok); // 在下一次循环迭代前,存在一段没有等待/监听Context的短暂间隙 } });
此循环在多请求同时到达时是否会丢失消息?
解答
不会丢失请求,后续请求会等待循环迭代完成。
内容的提问来源于stack exchange,提问作者Andrea Bardelli
相关产品推荐
相关产品推荐

