我使用来自System.Net 命名空间的标准HttpListener。当我使用 Task.Delay 模拟服务器端的一些工作(无需等待)并使用 Apache 基准测试服务器时,它给出了良好的结果(2000 rps)。但是当我“等待”时,带宽约为 9 rps(根据 Apache Benchmark)。为什么会这样?感谢您的回答。
private async Task Listen()
{
while (listener.IsListening)
{
try
{
var context = await listener.GetContextAsync().ConfigureAwait(false);
context.Response.StatusCode = (int)HttpStatusCode.OK;
// good without await
await Task.Delay(100).ConfigureAwait(false);
using (var sw = new StreamWriter(context.Response.OutputStream))
{
await sw.WriteAsync("<html><body>Hello</body></html>");
await sw.FlushAsync();
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
public async Task Run()
{
listener.Start();
Task.Run(() => Listen());
}
最佳答案
这是因为您插入的暂停延迟了循环。
你只接受线上的请求:
await listener.GetContextAsync()
在同一个循环中。
这意味着您必须等待之前的请求完成,然后才能接受新的上下文。
您很可能希望同时处理接受的上下文。为实现这一点,您应该在紧密循环中接受上下文,然后将请求的处理分拆到不会“挂起”接受循环的不同位置。
在最简单的情况下,您可以“即发即弃”...
while (listener.IsListening)
{
var context = await listener.GetContextAsync().ConfigureAwait(false);
HandleContextAsync(context); //note: not awaited
}
...实际上,您需要更深入地思考如何在 HandleContextAsync
方法中跟踪异常。
关于c# - 异步等待 Task.Delay 显着降低了基于 HttpListener 的服务器的带宽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48709023/