gpt4 book ai didi

c# - 使用 HttpResponseMessage 进行长时间操作的异步

转载 作者:太空宇宙 更新时间:2023-11-03 18:22:52 26 4
gpt4 key购买 nike

我正在计算我的 C# web api 的性能。我写了一个非常简单的 HelloWorld 响应:

public class HelloWorldController : ApiController
{
public HttpResponseMessage Get()
{

return new HttpResponseMessage()
{
Content = new StringContent("HelloWorld")
};
}
}

我使用 JMeter 进行了测试我设置了 1000 个用户请求并且它运行良好(CPU 使用率高达 100%)。但问题是,当 api 的操作时间更长时,响应变得更糟,每个响应只有 3 个(CPU 使用率 <7%)。 1000 个用户请求需要几分钟。

public HttpResponseMessage Get()
{
Thread.Sleep(1000);
return new HttpResponseMessage()
{
Content = new StringContent("HelloWorld")
};
}

在谷歌之后,我想出了使用异步的想法,但我仍然遇到了同样的问题。我不知道问题是什么或我的代码实现。下面是我的示例实现。

public async Task<HttpResponseMessage> Get()
{
return new HttpResponseMessage()
{
Content = new StringContent(await LongOperationAsync())
};
}
private string LongOperation()
{
//long operation here
Thread.Sleep(1000);
return "HelloWorld";
}

private Task<string> LongOperationAsync()
{
return Task.Factory.StartNew(() => LongOperation());
}

有人知道问题是什么或关于这个问题的任何想法吗?

最佳答案

asyncawait 并不是“mak teh codez moah awesomz”的 Elixir 。 On ASP.NET, await enables your application to be more scalable (and respond to changes in scale more quickly) by making optimum use of the thread pool .

因此,如果您正在释放一个线程池线程 (await) 但用完了另一个线程池线程 (StartNew),您将不会获得任何事物。特别是,exposing a fake-async method for a synchronous API is an antipattern .

如果可能,最好的解决方案是使 LongOperationAsync 成为自然异步操作:

public async Task<HttpResponseMessage> Get()
{
return new HttpResponseMessage()
{
Content = new StringContent(await LongOperationAsync())
};
}

private async Task<string> LongOperationAsync()
{
//long operation here
await Task.Delay(1000);
return "HelloWorld";
}

如果这不可能,那么您最好保持同步。使用 Task.Run(或 even worseStartNew)根本没有帮助。

关于c# - 使用 HttpResponseMessage 进行长时间操作的异步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45650508/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com