This document provides an overview of asynchronous programming in C#. It defines asynchronous programming as freeing the current thread while waiting for an I/O operation like a network request to complete. There are two types of asynchronous work: I/O-bound like file access which doesn't need dedicated threads, and CPU-bound like calculations which do. Asynchronous programming keeps apps responsive, improves performance by utilizing multiple cores, and avoids thread pool starvation. It is compared to synchronous programming and different asynchronous patterns are described. The benefits of asynchronous programming in web APIs to handle many concurrent requests are explained. Finally, async/await syntax and its usefulness are covered along with some drawbacks.