Awaitable
This lesson explains the awaitable concept in C#
We'll cover the following...
Awaitable
In our previous example, we have used the await operator with objects of type Task. What types are allowed to be used with the await operator? The requirements are as follows:
The type should have a method
GetAwaiter()that returns an instance of a class satisfying specific properties. Say if the return type is classXthen it must meet the following bullet points.Xmust implement the interfaceINotifyCompletionand optionally theICriticalNotifyCompletioninterface.Xmust have an accessible, readable instance propertyIsCompletedof typebool.Xmust have an accessible instance methodGetResult()with no parameters and no type parameters.
A type which satisfies the above requirements can be used in an await expression. The Task class meets all the above requirements.
Working of await
What happens when an await expression is evaluated? The official documentation offers the most succint and comprehensive description which we preesent verbatime as below:
"The await operator suspends evaluation of the enclosing async method until the asynchronous operation represented by its operand completes. When the asynchronous operation completes, the await operator returns the result of the operation, if any. When the await operator is applied to the operand that represents already completed operation, it returns the result of the operation immediately without suspension of the enclosing method. The await operator doesn't block the thread that evaluates the async method. When the await operator suspends the enclosing method, the control returns to the caller of the method."
Think about await as points defined in a program from which threads can leave and return to at some later time in the future.
Awaitbale Example
Now that we understand the basic working of await/async, we'll write a class that we can await. In our example from the previous section, we used the method Task.Delay() to asynchronously wait for a specific duration. Now we'll build a class that can be passed-in the number of milliseconds to sleep. Let's see the skeleton of our class first: