在方法名后面加上"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相关问答推荐

如何从 tshark 的 stderr 捕获实时数据包计数?

当数据大量分布在微服务中时,我应该如何设计后端?

Msbuild try 构建 msbuild.exe 而不是我的 .csproj 文件

PowerShell - 如果用户输入凭据,则查询 AD 时出错

为什么 GetShortestDayName 返回的名称比预期的短?

如何在选项卡中 Select Winforms NumericUpDown 中的所有文本?

既然 .NET 有一个垃圾收集器,为什么我们需要终结器/析构器/dispose-pattern?

为什么不能使用 null 作为 Dictionary 的键?

从 switch 块中跳出 foreach 循环

有没有办法以编程方式最小化窗口

找不到 Microsoft.Office.Interop Visual Studio

如何从 appsettings.json 中获取价值

属性应该与其类型同名吗?

什么是 SUT,它来自哪里?

WCF反序列化如何在不调用构造函数的情况下实例化对象?

如何制作通用类型转换函数

何时使用抽象类?

.NET 中的对象引用有多大?

等待 Async Void 方法调用以进行单元测试

记录器包装器最佳实践