Post

C# | Asynchronous programming with [async | await | Task]

Using await and async Task in C#

In C#, asynchronous programming is used to improve the responsiveness of applications by allowing tasks to run concurrently without blocking the main thread. The await and async keywords play a crucial role in achieving this. This guide will show you how to use await and async Task effectively.

Introduction

Asynchronous programming in C# is essential for tasks that may take a significant amount of time, such as I/O-bound operations or network requests. By using await and async, you can ensure that your application remains responsive while waiting for these tasks to complete.

Using async Task

  1. Define an async Method: To use await, define an async method within a class, typically returning a Task or Task<T>.

    1
    2
    3
    4
    
    public async Task MyAsyncMethod()
    {
        // Asynchronous code here
    }
    
  2. Call the async Method: In another method, you can call your async method with the await keyword.

    1
    
    await MyAsyncMethod();
    

The await Keyword

The await keyword is used within an async method to pause execution until the awaited task completes. It allows the calling thread to continue other work without blocking.

1
2
3
4
5
async Task MyAsyncMethod()
{
    var result = await SomeAsyncTask();
    // Code after the await will execute when SomeAsyncTask is completed.
}

Exception Handling

To handle exceptions in asynchronous methods, you can use standard try-catch blocks. When an exception is thrown in an async method, it’s captured and propagated as part of the Task.

1
2
3
4
5
6
7
8
try
{
    await SomeAsyncMethod();
}
catch (Exception ex)
{
    // Handle the exception
}

Cancellation Tokens

To cancel an asynchronous operation, you can use CancellationToken. Pass a CancellationToken to the asynchronous method, and check for cancellation within the method.

1
2
3
4
5
6
7
async Task MyAsyncMethod(CancellationToken cancellationToken)
{
    // Check for cancellation
    cancellationToken.ThrowIfCancellationRequested();

    // Continue with the operation
}

Real-world Example

Here’s an example of a common real-world scenario: making an HTTP request asynchronously.

1
2
3
4
5
6
7
8
9
public async Task<string> FetchDataAsync(string url)
{
    using (var httpClient = new HttpClient())
    {
        var response = await httpClient.GetAsync(url);
        response.EnsureSuccessStatusCode();
        return await response.Content.ReadAsStringAsync();
    }
}

What Next?

Using await and async Task in C# allows you to write responsive and efficient applications, especially when dealing with I/O-bound or long-running tasks. It enables you to keep your application responsive and improve the overall user experience by allowing multiple tasks to run concurrently without blocking the main thread.

This post is licensed under CC BY 4.0 by the author.