是否使用“Async"?方法名称中的后缀取决于是否使用了“async"修饰符? [英] Does the use of the "Async" suffix in a method name depend on whether the 'async' modifier is used?

查看:17
本文介绍了是否使用“Async"?方法名称中的后缀取决于是否使用了“async"修饰符?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

使用Async"后缀方法名称的约定是什么?

What is the convention for suffixing method names with "Async"?

Async"后缀是否应该附加到使用 async 修饰符声明的方法?

Should the "Async" suffix be appended only to a method that is declared with the async modifier?

public async Task<bool> ConnectAsync()

或者方法只返回TaskTask就够了吗?

Or is it enough that the method just returns Task<T> or Task?

public Task<bool> ConnectAsync()

推荐答案

我认为即使从 Microsoft 文档中也能看出真相是模棱两可的:

I think the truth is ambiguous even from Microsoft documentation:

在 Visual Studio 2012 和 .NET Framework 4.5 中,任何方法用 async 关键字(Visual Basic 中的 Async)属性是被认为是一种异步方法,以及 C# 和 Visual Basic编译器执行必要的转换来实现使用 TAP 异步方法.异步方法应该返回 TaskTask 对象.

In Visual Studio 2012 and the .NET Framework 4.5, any method that is attributed with the async keyword (Async in Visual Basic) is considered an asynchronous method, and the C# and Visual Basic compilers perform the necessary transformations to implement the method asynchronously by using TAP. An asynchronous method should return either a Task or a Task<TResult> object.

http://msdn.microsoft.com/en-us/library/hh873177(v=vs.110).aspx

那已经不对了.任何带有 async 的方法都是异步的,然后它说它应该返回一个 TaskTask - 这不适合方法在调用堆栈的顶部,例如 Button_Click 或 async void.

That's not right already. Any method with async is asynchronous and then its saying it should return either a Task or Task<T> - which isn't right for methods at the top of a call stack, Button_Click for example, or async void.

当然要考虑约定的意义是什么?

Of course, you have to consider what is the point of the convention?

您可以说 Async 后缀约定是向 API 用户传达该方法是可等待的.对于可等待的方法,它必须为 void 返回 Task,或者为返回值的方法返回 Task,这意味着只有后者可以后缀为异步.

You could say that the Async suffix convention is to communicate to the API user that the method is awaitable. For a method to be awaitable, it must return Task for a void, or Task<T> for a value-returning method, which means only the latter can be suffixed with Async.

或者你可能会说 Async 后缀约定是为了传达该方法可以立即返回,放弃当前线程来执行其他工作并可能导致竞争.

Or you might say that the Async suffix convention is to communicate that the method can return immediately, relinquishing the current thread to perform other work and potentially causing races.

此 Microsoft 文档引用说:

This Microsoft doc quote says:

按照惯例,您附加Async"到具有异步或异步修饰符.

By convention, you append "Async" to the names of methods that have an Async or async modifier.

立即内容只能通过 Wayback Machine 获得

其中甚至没有提到您自己的返回 Task 的异步方法需要 Async 后缀,我想我们都同意他们这样做.

Which doesn't even mention that your own asynchronous methods returning Task need the Async suffix, which I think we all agree they do.

所以这个问题的答案可能是:两者都有.在这两种情况下,您都需要将 Async 附加到带有 async 关键字并返回 TaskTask 的方法>.

So the answer to this question could be: both. In both cases, you need to append Async to methods with async keyword and that return Task or Task<T>.

我要请 Stephen Toub 澄清情况.

I'm going to ask Stephen Toub to clarify the situation.

更新

所以我做到了.这是我们的好人所写的:

So I did. And here's what our good man wrote:

如果一个公共方法是任务返回的并且本质上是异步的(如与已知始终同步执行的方法相反完成但由于某种原因仍然返回一个任务),它应该有异步"后缀.这就是指导方针.这里的主要目标是命名是为了让消费者非常清楚被调用的方法可能无法完成的功能它的所有工作都是同步的;它当然也有助于案件同步和异步公开功能的地方方法,以便您需要名称差异来区分它们.如何该方法实现其异步实现无关紧要命名:是否使用 async/await 来获得编译器的帮助,或者是否使用了 System.Threading.Tasks 中的类型和方法直接(例如 TaskCompletionSource)并不重要,因为不影响方法的签名就消费者而言方法有关.

If a public method is Task-returning and is asynchronous in nature (as opposed to a method that is known to always execute synchronously to completion but still returns a Task for some reason), it should have an "Async" suffix. That’s the guideline. The primary goal here with the naming is to make it very obvious to a consumer of the functionality that the method being invoked will likely not complete all of its work synchronously; it of course also helps with the case where functionality is exposed with both synchronous and asynchronous methods such that you need a name difference to distinguish them. How the method achieves its asynchronous implementation is immaterial to the naming: whether async/await is used to garner the compiler’s help, or whether types and methods from System.Threading.Tasks are used directly (e.g. TaskCompletionSource) doesn’t really matter, as that doesn’t affect the method’s signature as far as a consumer of the method is concerned.

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

Of course, there are always exceptions to a guideline. The most notable one in the case of naming would be cases where an entire type’s raison d’etre is to provide async-focused functionality, in which case having Async on every method would be overkill, e.g. the methods on Task itself that produce other Tasks.

对于返回空值的异步方法,不希望有那些在公共区域的人,因为来电者没有很好的方式知道异步工作何时完成.如果一定要暴露公开返回空值的异步方法,但是,您可能会这样做想要一个传达异步工作的名称如果有意义,您可以在此处使用Async"后缀.鉴于这种情况应该是多么罕见,我认为这确实是一个逐案决定.

As for void-returning asynchronous methods, it’s not desirable to have those in public surface area, since the caller has no good way of knowing when the asynchronous work has completed. If you must expose a void-returning asynchronous method publicly, though, you likely do want to have a name that conveys that asynchronous work is being initiated, and you could use the "Async" suffix here if it made sense. Given how rare this case should be, I’d argue it’s really a case-by-case kind of decision.

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

I hope that helps, Steve

斯蒂芬开场白的简洁指导已经足够清楚了.它不包括 async void 因为想要创建具有这种设计的公共 API 是不寻常的,因为实现异步 void 的正确方法是返回一个普通的 Task 实例和让编译器发挥它的魔力.但是,如果您确实想要 public async void,则建议附加 Async.其他栈顶 async void 方法(例如事件处理程序)通常不是公开的,也无关紧要/限定.

The succinct guidance from Stephen’s opening sentence is clear enough. It excludes async void because it is unusual to want to create a public API with such a design since the correct way to implement an asynchronous void is to return a plain Task instance and let the compiler to its magic. However, if you did want a public async void, then appending Async is advised. Other top-of-stack async void methods such as event handlers are usually not public and don’t matter/qualify.

对我来说,它告诉我,如果我发现自己想在 async void 上添加后缀 Async,我可能应该把它变成一个 async Task 以便调用者可以等待它,然后附加 Async.

For me, it tells me that if I find myself wondering about suffixing Async on an async void, I probably should turn it into an async Task so that callers can await it, then append Async.

这篇关于是否使用“Async"?方法名称中的后缀取决于是否使用了“async"修饰符?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆