非异步异步方法的命名规范是什么?

3
众所周知,在C#中,异步方法应该以后缀“Async”命名(例如ReadAsyncCreateAsync)。
但在许多情况下,异步方法中并不需要使用async/await,例如:
public async Task<string> DoSomethingAsync()
{
    return await GetAsync();
}

可以重写为:

public Task<string> DoSomethingAsync()
{
    return GetAsync();
}

我的问题是:
1. 对于上述情况,其中async/await完全是可选的,哪个版本更正确?保留async/await还是直接返回Task
2. 如果第二个版本更好(直接返回Task),它是否应该按照惯例仍然以“Async”为后缀命名(即DoSomethingAsync)还是不用(即DoSomething)?

1
这两个版本几乎完全相同。(在续写上下文中有一些差异,但可能不相关。)惯例是如果返回一个任务,则使用“Async”后缀。无论任务是显式创建还是由编译器自动生成。(调用者无法区分。) - Raymond Chen
1个回答

7
对于上述情况,async/await是完全可选的,哪个版本更正确?保留 async/await 还是直接返回一个 Task?
我更喜欢直接返回一个 "Task" ,但我写了一篇关于在何时适当使用此方法的博客文章
如果第二个版本(直接返回一个 Task)更好,那么它是否应该以惯例仍以后缀 "Async" 命名(例如 DoSomethingAsync),还是不用(例如 DoSomething)?
是的。 "Async" 后缀意味着 "返回可等待对象"。

谢谢您的回答,只是出于好奇,直接返回一个 Task 是否更有效率,还是编译器会优化掉这些差异?谢谢。 - Lifu Huang
嗨 Stephen,我正在阅读你的博客文章。这是一篇很好的文章,但是我对异常部分有点困惑,为什么在var task = GetElidingKeywordsAsync(); 中会抛出异常?我以为只有在显式调用Wait()时才会抛出Task的异常。非常感谢! - Lifu Huang
@LifuHuang:因为是async关键字将异常放置在任务上。如果省略async,则抛出的任何异常都会直接抛出,而不会放置在任务上。 - Stephen Cleary
但是 public Task<string> GetElidingKeywordsAsync() 也返回一个 Task<string>,对吧?我认为在等待它(或在其上调用 Wait())之前都不应该抛出异常。 - Lifu Huang
所以这行代码 (var task = GetElidingKeywordsAsync();) 实际上不会抛出异常,对吧? - Lifu Huang
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接