You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 04:37:33