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