FAQ
Could we drop the Async suffix from all asynchronous methods?
No.
See this post on StackOverflow, or this issue on GitHub. Or this tweet by Nick Craver.
We use the Async suffix whenever a function returns an async behavior (e.g. Task or ValueTask) like .NET itself does. The reason for this being that it removes ambiguity and helps stop subtle bugs. For example, say a PR changes this:
public string MyFunc() { ... }
To this:
public Task<string>MyFunc() { ... }
If, elsewhere, someone uses the function:
var result = MyFunc();
Console.WriteLine(result);
... that will still work. But instead of writing a string, it will write a Task. And it is hard to see it. Contrast that with changing to:
public Task<string>MyFuncAsync() { ... }
Now, the name change forced a name change at the call site, so the impact will show in a code review. It is a safer, unambiguous version of the change.
Can we provide synchronous version of the asynchronous methods?
No.
Async-to-Sync such as client.StartAsync().Wait() can cause issues such as blocking, dead-locking, starving the ThreadPool etc. This is tricky, and there is no way we can provide a stable implementation of synchronous methods. We'd rather have them happen in user code.