![](/img/trans.png)
[英]Is it possible to determine parallelism of tasks by using Task.Delay to force a new thread?
[英]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.