c# - 只返回 View 的 Controller Action 是否有必要异步?

标签 c# .net asp.net-mvc asynchronous async-await

执行此基本操作:

[HttpGet]
public IActionResult Index()
{
    return View();
}

修改它以使用异步/等待:

[HttpGet]
public async Task<IActionResult> Index()
{
    return await Task.Run(() => View());
}

我很困惑这是否会改进我的代码。根据我的理解,await 关键字将释放调用线程,以便它可以在其他地方使用,这是更好地利用可用线程。

但我实际上并没有做任何其他事情,除了这件返回 View 的事情。使用 async 关键字实际上在编译代码中引入了状态机,这增加了复杂性。

让这个 Action 异步值得吗?有没有更好的方法来修改它以使其异步?

最佳答案

简短的回答是否定的。因为什么都没有async继续 View()在执行中没有任何地方可以让编译器释放线程以允许在同一线程上进行其他工作。

我想说的是,使这个特定方法异步可能(甚至稍微)降低性能,因为编译器将需要修改您的代码,使执行的代码更加复杂,一旦您使用 async关键字。

制作它的唯一好处async如果您有许多其他操作实际上正在利用 async,我可以看到这是为了保持一致性.如果你真的想拥有一个Task<T>出于一致性目的的签名,您可以考虑:

public Task<IActionResult> Index()
{
    return Task.FromResult(View());
}

(注意没有 async 涉及关键字,也没有 Task.Run 启动新任务运行)

关于c# - 只返回 View 的 Controller Action 是否有必要异步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52538345/

相关文章:

c# - Azure CloudBlockBlob.Exists() 方法始终返回 false

c# - 将 Linq to Sql 查询转换为更好的 sql

c# - Automapper项目使用

c# - 如何使用 Moq 对 Entity Framework 6 中的删除操作进行单元测试

javascript - 使用 URL.Action 帮助程序生成 URL 并正确编码 JavaScript 变量

asp.net-mvc - 常见的地方 MVC .NET 中的授权规则最佳实践

c# - ASP.NET MVC 网站(不是项目)是否有可能返回 HttpResponseMessage

c# - 使用C#应用下载youtube文件会产生UnauthorizedAccessException

c# - 为什么 C# 编译器重载解析算法将具有相同签名的静态成员和实例成员视为相等?

c# - 在没有任何类修改的情况下绑定(bind) object.object.prop