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.

Original source