Modern computer operating systems allow a program to have multiple threads of execution at one time. At least, they allow the appearance of having multiple things going on at the same time.1
It’s often useful to take advantage of this feature by allowing several operations to take place in parallel. This can be used to prevent a program’s user interface from becoming unresponsive while a time-consuming task is being performed, or it can be used to execute some other task while waiting for a blocking operation (an I/O, for example) to complete.
The Common Language Runtime provides two different ways to perform such operations: ...