We can use the async keyword to create asynchronous delegates and lambda expressions as well.
Here is a synchronous delegate that returns the square of a number:
Func<int, int> square = (x) => {return x * x;};
We can make the preceding delegate asynchronous by appending the async keyword, as follows:
Func<int, Task<int>> square =async (x) => {return x * x;};
Similarly, lambda expressions can be converted, as follows:
Func<int, Task<int>> square =async (x) => x * x;
Asynchronous methods work in a chain. Once you have made any one method asynchronous, then all methods that call that method need to be converted to being asynchronous as well, thus creating a long chain of asynchronous methods.