在方法名后面加上"Async"的惯例是什么?

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

public async Task<bool> ConnectAsync()

或者该方法只返回Task<T>Task就足够了吗?

public Task<bool> ConnectAsync()

推荐答案

我认为,即使从微软的文档来看,事实也是模棱两可的:

在Visual Studio 2012和.NET Framework 4.5,任何

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

这已经不对了.任何带有async的方法都是异步的,然后它应该返回TaskTask<T>-这对于位于调用堆栈顶部的方法是不正确的,例如Button_Click或async void.

当然,你必须考虑大会的意义是什么?

可以说,Async后缀约定是向API用户传达该方法正在等待.对于可等待的方法,它必须为void返回Task,或为value returning方法返回Task<T>,这意味着只有后者可以用Async作为后缀.

或者,您可能会说Async后缀约定是传达方法可以立即返回,放弃当前线程以执行其他工作,并可能导致冲突.

此Microsoft文档引用称:

按照惯例,在具有

Content now only available via the Wayback Machine

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


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


我要请Stephen Toub澄清一下情况.

Update

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

如果公共方法返回任务并且本质上是异步的(如 与已知总是同步执行的方法相反 完成,但由于某些原因仍返回任务),则它应该 一个"异步"后缀.这就是指导方针.这里的主要目标是 命名是为了使 被调用的方法可能无法完成的功能 它的所有工作都是同步进行的;当然,它也对此案有所帮助 其中,功能通过同步和异步两种方式公开 方法,以便您需要使用名称差异来区分它们.多么 该方法实现其异步实现对于 命名:是否使用异步/等待来获取编译器的帮助, 或者是否使用System.Threading.Tasks中的类型和方法 直接(例如TaskCompletionSource)实际上并不重要,因为 方法的使用者不影响方法的签名. 方法方面.

当然,一个问题总是有例外

至于void返回异步方法,不希望

我希望这有帮助,史蒂夫

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

对我来说,它告诉我,如果我发现自己想在async void上加Async,我可能应该把它变成async Task,这样呼叫者可以等待它,然后再加Async.

.net相关问答推荐

删除数据库项目中的表

NETSDK1083:无法识别指定的 RuntimeIdentifierwin10-x64

Blazor服务器应用程序需要在页面上点击才能与元素交互

是否存在指定的(子)索引分隔符?

问:在 Blazor WASM 应用程序中存储 api 密钥的最佳方式是什么?

如何将 Assembly.CodeBase 转换为 C# 中的文件系统路径?

是否可以将 SandCastle 创建的两个页面合并到一个主页中?

为什么 .NET 中的 System.Version 定义为 Major.Minor.Build.Revision?

您如何确定两个 HashSet 是否相等(按值,而不是按引用)?

根源是什么?

使用字典作为数据源绑定组合框

我可以从我的应用程序中抛出哪些内置 .NET 异常?

什么决定了 Path.GetTempPath() 的返回值?

在 ToString() 之前判断 null

如何比较 C# 中的(目录)路径?

嵌套的 Try/Catch 块是个坏主意吗?

为什么 .NET 中没有 Tree 类?

找不到 System.Windows.Media 命名空间?

如何从 HashSet 中检索实际项目?

Linq Query 不断抛出无法创建 System.Object 类型的常量值......,为什么?