Asynchronous workflows in F#
Asynchronous (async) workflows are computation expressions that are set up to run asynchronously. It means that the system runs without blocking the current computation thread when an I/O or another asynchronous process is performed.
You may be wondering why do we need asynchronous programming, and why can't we just use the threading concepts that we have used for so long. The problem with OS threads is that the operation occupies the thread for the entire time that something happens, or when a computation is done. On the other hand, with asynchronous programming, the runtime will enable a thread only when it is required, otherwise it will be a normal code. There is also lot of marshalling and unmarshalling code (infrastructure code) that we will write around to overcome the issues that we face when directly dealing with the OS threads. Thus, async model allows the code to execute efficiently, still preventing locking the main thread when we perform expensive...