gpt4 book ai didi

c# - 使用 Async Await 是否可以避免线程耗尽?

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

我们正在解决 .NET Core API 端点上的以下性能问题:

  1. 端点在较小的负载下始终在 500MS 内返回。
  2. 当我们从 3 个浏览器访问端点时,每秒一个请求,它变得越来越慢(在添加第三个浏览器进行调用的一分钟内,响应时间下降到 50,000MS 或更糟。
  3. 每个额外的浏览器都添加 API 使用的线程,例如以 40 个线程为基础,第二个浏览器命中端点导致 52 个线程,第三个峰值达到 70,依此类推。
  4. 加载一个端点时,整个 API 返回缓慢(所有端点)。这是我认为“线程耗尽”以及第 3 点的主要原因。

目前的代码是这样的:

    public IActionResult GetPresentationByEvent(int eventid)
{
return Authorized(authDto =>
{
var eventList = _eventService.GetPresentationByEvent(eventid);
return Ok(eventList)
})
}

我的理论是 return Authorized(authDto => 持有一个线程直到它返回,导致线程耗尽。

    public async Task<IActionResult> GetPresentationByEvent(int eventid)
{
return Authorized(async authDto =>
{
Task<List<whatever>> eventList = _eventService.GetPresentationByEvent(eventid);
return Ok(eventList)
}
}

Authorized 是第三方库的一部分,所以我不能轻易测试它。想知道这是否看起来像一个可能的问题/解决方案。

最佳答案

是的,async await 可以减少线程耗尽。简而言之,当您生成的任务多于 ThreadPool 可以处理的数量时,就会出现线程耗尽。

您可以在此处查看一些细微的特性:Thread starvation and queuing

你唯一需要记住的是你永远不应该在任务中阻塞。这意味着使用 async await 调用异步代码(永远不要在未完成的任务上使用 .Wait 或 .Result)。

如果您使用一些不使用异步等待模式的阻塞代码,您必须在专用线程(而不是任务线程队列)上生成它。

关于c# - 使用 Async Await 是否可以避免线程耗尽?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57611394/

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