Custom awaitable and awaiter types in C# 5.0 asynchronous
In C# 5.0 you can use the await keyword to await an awaitable object. But what is the minimum requirement for an object to be considered awaitable by C#? Interestingly there are no interfaces to be implemented in order to be considered awaitable!
Having a parameter-less method named GetAwaiter() which returns an awaiter object is the only convention for a type to be recognized awaitable by C#:
// This class is awaitable because it has the GetAwaiter method, provided MyAwaiter is an awaiter. public class MyWaitable { public MyAwaiter GetAwaiter() { return new MyAwaiter(); } }
Now the question is how to make a type awaiter? The minimum requirements for a type to be awiater are implementing the INotifyCompletion interface, and having the IsCompleted property and the GetResult method with the following signatures:
public class MyAwaiter : INotifyCompletion { public void OnCompleted(Action continuation) {
}
public bool IsCompleted { get { return false; } }
public void GetResult() {
} }

