Async and Await in
C#
In
this article we will discuss about the two new keywords that were introduced in
C# 5.0, for implementing asynchronous programming. So let's start with some
basic their definitions, rules we have to follow to implement it.
await: As per MSDN, await is
The await operator is applied to a task
in an asynchronous method to suspend the execution of the method until the
awaited task completes. The task represents ongoing work.
This
means, if we apply this keyword to a method, and when the control reaches
that method, that method will start running in asynchronous mode and the
control will move on to the next statement in the program. This is simply done
by using the syntax
await Method_Name()
async: Simply adding this keyword
will not work. The method in which
await is used, must be marked with
the async keyword. So if we need
to make a method (say Method1Async()) asynchronous ,using await,
inside a method named Method2(),
we call it using the code as:function void
Method2(){ await Method1Async();}
Task: The task or function which is
to be made asynchronous, has a return type of the type
Task which represents void return type or Task<TResult>, where TResult is the type of data returned by
the function. So, for our method above, i.e. Method2,
assuming that it returns an integer value, the signature will be of the
following type:function
Task<Int32> Method2(){ return 1;}
So
this was the basic discussion. Now let's convert the above code into an
example. For this, our asynchronous method or
Method2, will be something which takes
time to complete and returns us an integer value. In our case, we will simply
make it sleep using Thread.Sleep and then return an integer
value. So it's signature will become like the following:
Next,
we create another function inside which we will call this function using
await keyword. The reason we are not
calling this function in the Main function is that we need to
make the parent function as async and Main function cannot be made async. So we have to introduce an
intermediate function named Method2(). Next,
we simply need to call this function in the Main function. We are also
printing different values, which will help us to evaluate and understand the
flow of the program in better way. So our complete code becomes like the
following:
Run
this code and see the results:
Let's
try to understand the flow of the program with the above output.
1.
The program execution starts with the execution of the
2. Next, it moves on to call
3. Then it continues the
4. Finally when execution of the asynchronous method is completed, it again resumes the execution of the
Main function and prints the very
first line "Starting the ASYNCHRONOUS
process".2. Next, it moves on to call
Method1,
which in turns Method2.
As the Method2 is marked with the await keyword, it starts
its execution in an asyncrhonous mode, suspend the further
execution of the Method1 and immediately returns to the
calling statement in the Main function, without printing the
message in the very next line.3. Then it continues the
Main function and starts processing
the for loop and print the message.4. Finally when execution of the asynchronous method is completed, it again resumes the execution of the
Method2 and prints the results, with
the return value received from Method2.
So
this was about the use of the
async and await keywords. Hope you enjoyed
reading it...!!!


No comments:
Post a Comment