gpt4 book ai didi

c# - 使 Controller 异步的最简单方法

转载 作者:太空狗 更新时间:2023-10-30 00:31:38 25 4
gpt4 key购买 nike

我继承了一个使用 MVC5 和 C# 的大型 Web 应用程序。我们的一些 Controller 进行了几次缓慢的数据库调用,我想让它们异步以允许工作线程在等待数据库调用完成时为其他请求提供服务。我想用最少的重构来做到这一点。假设我有以下 Controller

public string JsonData()
{
var a = this.servicelayer.getA();
var b = this.servicelayer.getB();
return SerializeObject(new {a, b});
}

我通过保持服务层不变并将 Controller 重写为使两个昂贵的调用 a、b 异步

public async Task<string> JsonData()
{
var task1 = Task<something>.Run(() => this.servicelayer.getA());
var task2 = Task<somethingelse>.Run(() => this.servicelayer.getB());
await Task.WhenAll(task1, task2);
var a = await task1;
var b = await task2;
return SerializeObject(new {a, b});
}

上面的代码运行没有任何问题,但我无法使用 Visual Studio 判断工作线程现在是否可用于服务其他请求,或者如果在 asp.net Controller 中使用 Task.Run() 不能执行我的操作认为是的。任何人都可以评论我的代码的正确性以及是否可以以任何方式改进它?另外,我读到在 Controller 中使用异步会产生额外的开销,应该只用于长时间运行的代码。我可以用来决定 Controller 是否需要异步的最低标准是什么?我知道每个用例都是不同的,但想知道是否有一个基线可以作为起点。 2 数据库调用?任何超过 2 秒的返回?

最佳答案

准则是只要有 I/O 就应该使用异步。即,一个数据库。与任何类型的 I/O 相比,开销微乎其微。

也就是说,通过 Task.Run 阻塞线程池线程就是我所说的“伪异步”。这正是您不想在 ASP.NET 上做的事情。

相反,从您的“最低级”代码开始,使其真正异步。例如,EF6 支持异步数据库查询。然后让 async 代码从那里自然地增长到您的 Controller 。

关于c# - 使 Controller 异步的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24092768/

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