In computer programming, the async/await pattern is a syntactic feature of many programming languages that allows an asynchronous, non-blocking function to be structured in a way similar to an ordinary synchronous function. It is semantically related to the concept of a coroutine and is often implemented using similar techniques, and is primarily intended to provide opportunities for the program to execute other code while waiting for a long-running, asynchronous task to complete, usually represented by promises or similar data structures. The feature is found in C# 5.0, C++20, Python 3.5, F#, Hack, Julia, Dart, Kotlin 1.1, Rust 1.39, Nim 0.9.4, JavaScript ES2017, Swift 5.5 and Zig, with some experimental work in extensions, beta versions, and particular implementations of Scala.
F# added asynchronous workflows with await points in version 2.0 in 2007. This influenced the async/await mechanism added to C#.
Microsoft released a version of C# with async/await for the first time in the Async CTP (2011). And were later officially released in C# 5 (2012).
Haskell lead developer Simon Marlow created the async package in 2012.
Python added support for async/await with version 3.5 in 2015 adding 2 new keywords, async and await.
TypeScript added support for async/await with version 1.7 in 2015.
Javascript added support for async/await in 2017 as part of ECMAScript 2017 JavaScript edition.
Rust added support for async/await with version 1.39.0 in 2019 with 1 new keyword async and a lazy eval await pattern.
C++ added support for async/await with version 20 in 2020 with 3 new keywords co_return, co_await, co_yield.
Swift added support for async/await with version 5.5 in 2021, adding 2 new keywords async and await. This was released alongside a concrete implementation of the Actor model with the actor keyword which uses async/await to mediate access to each actor from outside.
The C# function below, which downloads a resource from a URI and returns the resource's length, uses this async/await pattern:
public async Task FindPageSizeAsync(Uri uri)
{
var client = new HttpClient();
byte[] data = await client.