From 2954a1d656f3bbb2debee343393fc3da480eac4a Mon Sep 17 00:00:00 2001 From: Vladimir Shchur Date: Thu, 17 Apr 2025 13:57:17 -0700 Subject: [PATCH 1/2] Update task-expressions.md Added `and!` section --- .../language-reference/task-expressions.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/docs/fsharp/language-reference/task-expressions.md b/docs/fsharp/language-reference/task-expressions.md index bff6cb52068fa..cb241c53e029c 100644 --- a/docs/fsharp/language-reference/task-expressions.md +++ b/docs/fsharp/language-reference/task-expressions.md @@ -68,6 +68,29 @@ let makeTask() = makeTask() |> ValueTask ``` + +## `and!` bindings (starting from F# 10) + +Within task expressions, it is possible to concurrently await for multiple asynchronous operations (`Task<'T>`, `ValueTask<'T>`, `Async<'T>` etc). Compare: + +```fsharp +// We'll wait for x to resolve and then for y to resolve. Overall execution time is sum of two execution times. +let getResultsSequentially() = + task { + let! x = getX() + let! y = getY() + return x, y + } + +// x and y will be awaited concurrently. Overall execution time is the time of the slowest operation. +let getResultsConcurrently() = + task { + let! x = getX() + and! y = getY() + return x, y + } +``` + ## Adding cancellation tokens and cancellation checks Unlike F# async expressions, task expressions do not implicitly pass a cancellation token and don't implicitly perform cancellation checks. If your code requires a cancellation token, you should specify the cancellation token as a parameter. For example: From 9c1f2f1cec7e5b6373272d17f7c285f6e935f047 Mon Sep 17 00:00:00 2001 From: Bill Wagner Date: Thu, 24 Apr 2025 10:29:24 -0400 Subject: [PATCH 2/2] Update docs/fsharp/language-reference/task-expressions.md --- docs/fsharp/language-reference/task-expressions.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/fsharp/language-reference/task-expressions.md b/docs/fsharp/language-reference/task-expressions.md index cb241c53e029c..85aa846f20aeb 100644 --- a/docs/fsharp/language-reference/task-expressions.md +++ b/docs/fsharp/language-reference/task-expressions.md @@ -68,7 +68,6 @@ let makeTask() = makeTask() |> ValueTask ``` - ## `and!` bindings (starting from F# 10) Within task expressions, it is possible to concurrently await for multiple asynchronous operations (`Task<'T>`, `ValueTask<'T>`, `Async<'T>` etc). Compare: