C# Tutorials - Herong's Tutorial Examples - v3.32, by Herong Yang
"await" Expression and Child Thread
A tutorial example is provided on how to use the 'await' expression on an awaitable task to launch a child thread to wait for the task to complete.
After learning the asynchronous behavior of the GetStringAsync() method from the HttpClient class, we can take a closer look at the "await" operator now.
According to the C# 5 specification, the "await" operator works under the following rules:
The evaluation of "await t" goes roughly like this:
Based on Microsoft examples, the task returned by "GetStringAsync()" seems to be awaitable task. So let's use it in an "await" expression in a tutorial example, AwaitExpressionTest.cs:
// AwaitExpressionTest.cs // Copyright (c) 2016 HerongYang.com. All Rights Reserved. using System; using System.Net.Http; using System.Threading.Tasks; public class AwaitExpressionTest { static void Main() { Console.WriteLine("Before 'await' ..."); AwaitTest(); Console.WriteLine("After 'await' ..."); } async static void AwaitTest() { string uri = "https://www.herongyang.com/Service/Hello_REST.php"; HttpClient c = new HttpClient(); Console.WriteLine("Calling GetStringAsync()..."); Task<string> t = c.GetStringAsync(uri); Console.WriteLine("Evaluating await-expression ..."); string s = await t; Console.WriteLine("Writing task result ..."); Console.WriteLine(s); } }
If you compile and run this tutorial example with .NET Framework 4.6.1 SDK, you will get:
C:\herong>%NET%\csc "/r:%REF%/System.Net.Http.dll" AwaitExpressionTest.cs Microsoft (R) Visual C# Compiler version 4.6.1055.0 for C# 5 Copyright (C) Microsoft Corporation. All rights reserved. C:\herong>AwaitExpressionTest Before 'await' ... Calling GetStringAsync()... Evaluating await-expression ... After 'await' ...
Not too bad. The tutorial example worked. But the remaining portion of the AwaitTest() method after the "await" expression did not get a chance to be executed. Here is my understanding of what happened:
Child thread #2 was supposed to continue with statements after "await t" after Child thread #1 reached to the end. But main thread ended before that occurred as shown in the diagram below:
Table of Contents
Logical Expressions and Conditional Statements
Visual C# 2010 Express Edition
C# Compiler and Intermediate Language
Compiling C# Source Code Files
MSBuild - Microsoft Build Engine
GetStringAsync() Method in HttpClient Class
GetStringAsync() Method Example Program
Watching Asynchronous Operation Execution Status
►"await" Expression and Child Thread
"await" Expression Thread Example
System.Diagnostics.FileVersionInfo Class
WPF - Windows Presentation Foundation