In asynchronous programming, many control flows can exist at once. With the Async and Await keywords in VB.NET we have a standard, clear way to program this way.
Threading is supported, but with Async and Await, we do not need multiple threads. Some actions are (like downloading from the network) are faster when done in an asynchronous way.
This example is somewhat complex. In Main
we create a new Task—we must use AddressOf
in VB.NET to reference a function for the Task.
Main
we invoke Start and Wait on the task. The program does not exit until ProcessDataAsync
finishes.ProcessDataAsync
Sub
is Async. It contains a usage of Await.Sub
, causes the method to pause until the task (an argument to Await) is finished.Imports System.IO Module Module1 Sub Main() ' Create a Task with AddressOf. Dim task = New Task(AddressOf ProcessDataAsync) ' Start and wait for task to end. task.Start() task.Wait() Console.ReadLine() End Sub Async Sub ProcessDataAsync() ' Create a task Of Integer. ' ... Use HandleFileAsync method with a large file. Dim task As Task(Of Integer) = HandleFileAsync("C:\enable1.txt") ' This statement runs while HandleFileAsync executes. Console.WriteLine("Please wait, processing") ' Use await to wait for task to complete. Dim result As Integer = Await task Console.WriteLine("Count: " + result.ToString()) End Sub Async Function HandleFileAsync(ByVal file As String) As Task(Of Integer) Console.WriteLine("HandleFile enter") ' Open the file. Dim count As Integer = 0 Using reader As StreamReader = New StreamReader(file) Dim value As String = Await reader.ReadToEndAsync() count += value.Length ' Do a slow computation on the file. For i = 0 To 10000 Step 1 Dim x = value.GetHashCode() If x = 0 Then count -= 1 End If Next End Using Console.WriteLine("HandleFile exit") Return count End Function End ModuleHandleFile enter Please wait, processingHandleFile enter Please wait, processing HandleFile exit Count: 1916146
HandleFileAsync
Please look at HandleFileAsync
. This uses a StreamReader
to open and read (in an asynchronous way) the specified file.
For
-loop in HandleFileAsync
is meant to take a long time. This demonstrates the benefit of Async and Await.When the Await keyword is encountered, control flow pauses until its Task finishes execution. So the "count" returned from HandleFileAsync
is always ready to be printed.
In .NET many types like StreamReader
and HttpClient
have asynchronous features. With Async and Await we exploit these features to improve program responsiveness.