5

我刚刚将我的 Visual Studio 2015 ASP.NET MVC Core 项目转换为 Visual Studio 2017...我在错误列表中收到以下信息性消息

消息 IDE1006 命名规则违规:缺少后缀:“异步”

此消息出现在我的控制器中,主要关注以下内容:

public async Task<IActionResult> Index()

这也适用于创建、删除、详细信息和编辑。这些消息显示为信息性的,适用于我的项目中的 1,000 多个事件。看来我需要将 Index 更改为 IndexAsync 即。
更改自:

public async Task<IActionResult> Index()
public async Task<IActionResult> Create()
public async Task<IActionResult> Delete(int? id)
public async Task<IActionResult> Details(int? id)

改成:

public async Task<IActionResult> IndexAsync()
public async Task<IActionResult> CreateAsync()
public async Task<IActionResult> DeleteAsync(int? id)
public async Task<IActionResult> DetailsAysnc(int? id)

目前这似乎是可选的,因为我的项目将构建,这在 VS 2015 中不是问题。我不介意做这项工作,我需要确认在 Visual Studio 2017 ASP.NET Core 中更改它是正确的方法。

4

2 回答 2

4

Microsoft 正在推动您使用 async 一词为您的异步方法添加后缀。为什么?Visual Studio 2017的发行说明提到了这个花絮。

异步方法的类似任务的返回类型:这引入了从异步方法返回任何类似任务的类型的能力。以前这些返回类型被限制为Task<T>and Task

听起来,仅通过检查它们的返回类型,哪些方法是异步的就变得不那么明显了。给它们加上 async 后缀可能是个好主意。在 VS 提出这个“建议”之前,有一个先前的堆栈溢出问题就该约定进行辩论。来自微软的 Stephen Toub 解决了这个问题,我引用了。

如果公共方法是返回任务并且本质上是异步的(与已知始终同步执行以完成但由于某种原因仍返回任务的方法相反),它应该具有“异步”后缀。这就是指导方针。此处命名的主要目的是让功能的使用者非常清楚,被调用的方法可能不会同步完成其所有工作;当然,它也有助于同时使用同步和异步方法公开功能的情况,以便您需要名称差异来区分它们。方法如何实现其异步实现与命名无关:是否使用 async/await 来获得编译器的帮助,或者是否直接使用 System.Threading.Tasks 中的类型和方法(例如

当然,指南总是有例外的。在命名的情况下,最值得注意的是整个类型的存在理由是提供以异步为中心的功能,在这种情况下,在每个方法上都使用 Async 将是矫枉过正的,例如,任务本身的方法会产生其他任务.

至于返回 void 的异步方法,不希望将它们放在公共表面区域,因为调用者无法知道异步工作何时完成。但是,如果您必须公开一个返回 void 的异步方法,您可能确实希望有一个名称来传达正在启动的异步工作,如果有意义的话,您可以在此处使用“Async”后缀。鉴于这种情况应该是多么罕见,我认为这确实是一种逐案决定。

我希望这会有所帮助,史蒂夫

归根结底,它是信息性的。但随着 Microsoft 将返回类型扩展到 Task 之外,它开始看起来越来越像最佳实践。用你自己的判断。

于 2016-11-19T16:47:06.203 回答
0

我注意到对于 MVC 控制器类,除了将 Async 添加到方法名称之外,我还需要添加 [ActionName("MethodName")] 作为方法属性,其中 "MethodName" 最后没有 Async。如果我没有添加 ActionName 属性,代码会编译,但 URL 不会路由到方法,除非我也在 URL 中添加了 Async。我不想在我的 URL 中使用异步,所以我最终在各处添加了 ActionName 属性。似乎 MVC 路由引擎应该尝试找到 Async 方法,但事实并非如此。

于 2017-01-31T17:50:58.087 回答