I think the truth is ambiguous even from Microsoft documentation:
In Visual Studio 2012 and the .NET Framework 4.5, any method that is associated with the async ( async in Visual Basic) is considered an asynchronous method, and C # and Visual Basic compilers perform the necessary transformations to implement the method asynchronously using TAP. The asynchronous method should return either a Task object or a Task<TResult> .
http://msdn.microsoft.com/en-us/library/hh873177 (v = vs .110) .aspx
This is no longer the case. Any method with async is asynchronous, and then says that it should return either Task or Task<T> - which is not suitable for methods at the top of the call stack, such as Button_Click or async void .
Of course, you should consider what is the point of the convention?
We can say that the async suffix convention is to tell the user the API that the method is expected. For the method to be expected, it must return Task for void or Task<T> for the return method, which means that only the latter can be a suffix with async .
Or you can say that the async suffix convention is to let the method know that it can return immediately, discarding the current thread to do other work and potentially causing a race.
This quote from Microsoft states:
By convention, you add "Async" to the names of methods that have an Asynchronous or Asynchronous modifier.
http://msdn.microsoft.com/en-us/library/hh191443.aspx#BKMK_NamingConvention
Which does not even mention that your own asynchronous methods returning Task need the async suffix, which, I think, we all agree on what they do.
Thus, the answer to this question may be as follows: both. In both cases, you need to add async to the methods with the async and return Task or Task<T> .
I will ask Stephen Tub to clarify the situation.
Update
So I did. And here is what our good man wrote:
If the public method is a task return and is asynchronous in nature (as opposed to a method that, as you know, always runs synchronously with but still returns the task for some reason), it should have the suffix "Async". This is a guide. The main purpose of naming here is to make it very obvious to the consumer the functionality that calls the method will most likely not complete all its work synchronously; this, of course, also helps in the case where the functionality is exposed to synchronous and asynchronous methods, so you need to distinguish names to distinguish them. How the method achieves its asynchronous implementation does not matter for naming: whether async / await is used to collect compiler help, or are the types and methods from System.Threading.Tasks used directly (for example, TaskCompletionSource) really does not matter, since this does not affect on signature methods in relation to the consumer method.
Of course, there are always exceptions to the manual. The most noticeable in the case of naming will be cases where integer raison detre types should provide asynchronous focusing functionality, and in this case, the presence of Async for each method will be excessive, for example. methods of the Task itself, which produce other tasks.
As for asynchronous methods that return voids, it is undesirable to have those in the public surface area, since the caller does not have a good way of knowing when the asynchronous operation is completed. If you have to expose a public asynchronous method that returns void, although you probably want to have a name that conveys that asynchronous operation and you can use the suffix "Async" here if that makes sense. Given how rare this case should be, Id proves that this is valid on a case-by-case basis.
I hope this helps, Steve
A quick guide from Stevens' introductory sentence is clear enough. This eliminates async void because it is unusual to create a public API with this design, since the correct way to implement asynchronous void is to return a simple instance of Task and let the compiler do its magic. However, if you need public async void then adding async recommended. Other top-of-stack async void methods, such as event handlers, are usually not public and have no value / qualification.
For me, this tells me that if I wonder about the async suffix on async void , I probably should turn it into an async Task so that callers can wait for it and then add async .