繁体   English   中英

使用任务和 task.delay 时 HttpListener 阻塞

[英]HttpListener blocking when using tasks and task.delay

所以做一个个人项目写一个简单的http服务器。 没有什么花哨。 但我想使用任务来处理请求。 所以我写了下面的代码,由于某种原因它“阻塞”但不是真的?

所以我启动服务器,然后在 chrome 中打开两个单独的选项卡,我大致同时向服务器发送请求。 所以理论上这两个请求应该在大约 3 秒内完成。 但是,第一个选项卡在 3 秒后加载,然后第二个选项卡在第一个选项卡后 3 秒加载,因此总共 6 秒。

有趣的是,似乎服务器运行的主线程没有被阻塞,但任务线程却被阻塞了。 我说主线程没有被阻塞的原因是它在 while 循环中再次迭代并在启动HandleRequestAsync后立即到达“等待连接”的写入行。 output 看起来像这样。 如果第一次调用尚未完成,似乎它会在第二次调用HandleRequestAsync时被阻止。

Output

Waiting for connection
Finished Connection
Waiting for connection
Delay over
Finished Connection
Waiting for connection
Delay over

代码

class Server
{
    private HttpListener listener { get; set; }
        
    private async Task HandleRequestAsync(HttpListenerRequest request, HttpListenerResponse response)
    {
        await Task.Delay(3000);
        Console.WriteLine("Delay over");

        response.ContentLength64 = 4;
        response.OutputStream.Write(Encoding.UTF8.GetBytes("Test"));

        response.OutputStream.Close();
    }

    public async Task StartServing()
    {
        listener.Start();

        while(true)
        {
            Console.WriteLine("Waiting for connection");

            var ctx = await listener.GetContextAsync().ConfigureAwait(false);

            HandleRequestAsync(ctx.Request, ctx.Response);

            Console.WriteLine("Finished Connection");
        }
    }
    public Server()
    {
        listener = new HttpListener();
        listener.Prefixes.Add("http://localhost:8000/");
    }
}

如问题的评论所示。 Chrome 和几乎所有 web 浏览器都会限制可以与一台主机建立多少并发连接,即使它们位于不同的选项卡中也是如此。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM