The awaitable and awaiter In C# 5.0 Asynchronous
async-await, asynchronous, c#, c#-5.0
Solution
It is best answered in Lucian Wischik's blog post Why must async methods return Task?
In summary (and I am not doing the blog post justice, you should read it), the issue is that `Task` already exists, so introducing an interface would mean
- All the internal methods would need to be changed to the interface, a break change and thus almost impossible for the framework people to willingly do.
- As a programmer you would constantly need to decide if you want to return `Task` or the interface, a decision that doesn't matter much.
- The compiler would always need a concrete type, so even if you returned an interface from a method then it would still be compiled as `Task`.
The impact from the above is so massive that it doesn't make sense to provide an interface.
Problem
Task or Task<TResult> object is awaitable, so we can use await key on those whose return value is Task or Task<TResult>. Task or Task<TResult> are the most frequently-used awaitable object. We also can define our own awaitable object.The object should has below qualification. - It has a GetAwaiter() method (instance method or extension method); - Its GetAwaiter() method returns an awaiter. An object is an awaiter if: - It implements INotifyCompletion or ICriticalNotifyCompletion interface; - It has an IsCompleted, which has a getter and returns a Boolean; - it has a GetResult() method, which returns void, or a result. My question is that why Microsoft didn't provide a interface to constrain these awaitable object? The current method to implement awaitable object is a little complicated.