在方法名后面加上"Async"的惯例是什么?
"Async"后缀是否应该被添加到使用async
修饰符声明的方法中?
public async Task<bool> ConnectAsync()
或者该方法只返回Task<T>
或Task
就足够了吗?
public Task<bool> ConnectAsync()
在方法名后面加上"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
的方法都是异步的,然后它应该返回Task
或Task<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
关键字且返回Task
或Task<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
.