小编典典

方法名称中“ Async”后缀的使用是否取决于是否使用了“ async”修饰符?

c#

在方法名称后缀“ Async”的约定是什么?

应在“异步”后缀被追加 到被声明为一个方法async修改?

public async Task<bool> ConnectAsync()

抑或是足够的方法只返回Task<T>Task

public Task<bool> ConnectAsync()

阅读 721

收藏
2020-05-19

共1个答案

小编典典

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

在Visual Studio 2012和.NET Framework 4.5中,使用async关键字(Async在Visual
Basic中)赋予的任何方法均被视为异步方法,并且C#和Visual
Basic编译器执行必要的转换,以使用TAP异步实现该方法。异步方法应返回TaskTask<TResult>对象。

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

那还不对。带有的任何方法async都是异步的,然后说应该返回TaskTask<T>-,这不适用于调用堆栈顶部的方法,例如Button_Click或async void

当然,您必须考虑公约的意义是什么?

您可以说Async后缀约定是为了向API用户传达该方法是可以等待的。为了使方法可以等待,它必须返回Task一个空Task<T>值或一个返回值的方法,这意味着只有后者可以带有后缀Async

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

此Microsoft Doc引用说:

按照惯例,您可以在具有Async或async修饰符的方法名称后附加“ Async”。

http://msdn.microsoft.com/zh-
cn/library/hh191443.aspx#BKMK_NamingConvention

甚至没有提到您自己的异步方法返回Task需要Async后缀,我认为我们都同意后缀。


因此,这个问题的答案可能是:两者都有。在这两种情况下,您都需要Async使用async关键字将方法追加到返回Task或的方法上Task<T>


我要请Stephen Toub澄清情况。

更新资料

所以我做了。这就是我们的好男人写的:

如果公用方法是返回Task的并且本质上是异步的(与已知的方法始终同步执行到完成但由于某种原因仍返回Task的方法相反),则该公用方法应具有“异步”后缀。这就是指导方针。这里的命名的主要目的是使功能的使用者非常清楚,所调用的方法可能不会同步完成其所有工作。当然,在同步和异步方法都公开功能的情况下,它也很有帮助,因此您需要使用名称差异来区分它们。该方法如何实现其异步实现与命名无关紧要:是否使用async
/
await来获得编译器的帮助,或者是否直接使用System.Threading.Tasks中的类型和方法(e。G。TaskCompletionSource)并不重要,因为就该方法的使用者而言,它不会影响该方法的签名。

当然,指南总是有例外。在命名的情况下,最值得注意的情况是整个类型的存在理由是要提供以异步为重点的功能,在这种情况下,每个方法上都具有异步功能可能会过大,例如Task上的方法会产生其他Tasks

至于返回空值的异步方法,不希望将它们放在公共区域中,因为调用者没有很好的方法来知道异步工作何时完成。但是,如果必须公开公开一个返回空值的异步方法,则可能确实想要一个传达异步工作正在启动的名称,如果可以的话,可以在此处使用“异步”后缀。考虑到这种情况应该是多么罕见,我认为这实际上是个案决定。

我希望有帮助,史蒂夫

斯蒂芬开场白的简洁指导很清楚。它async void之所以排除在外是因为用这种设计来创建公共API是不寻常的,因为实现异步void的正确方法是返回一个纯Task实例并让编译器发挥作用。但是,如果您确实需要public async void,则Async建议添加。其他堆栈顶部async void方法(例如事件处理程序)通常不是公开的,并且不重要/不合格。

对我来说,它告诉我,如果我发现自己想Async对an进行后缀async void,我可能应该将其转换为an,async Task以便调用者可以等待它,然后追加Async

2020-05-19