Async code allows long-running operations like network and file access to execute without blocking the UI thread. There have been several approaches to async programming in .NET including the Async Programming Model (APM), Event-based Async Pattern (EAP), and Task Parallel Library. The newest approach is to use async and await keywords which allow suspending methods until async operations complete and make control flow easier to reason about.