Hỗ trợ để xử lý nhiều việc cùng lúc là nền tảng cho mọi khối lượng công việc trên thực tế, cho dù đó là ứng dụng client đang xử lý nền trong khi vẫn giữ cho giao diện người dùng phản hồi nhanh, các dịch vụ xử lý hàng ngàn yêu cầu đồng thời, các thiết bị phản hồi vô số tác nhân kích hoạt đồng thời hoặc các máy tính cao cấp hỗ trợ song song việc xử lý các hoạt động sử dụng nhiều sức mạnh tính toán. Các hệ điều hành cung cấp hỗ trợ cho sự đồng thời như vậy thông qua các luồng (thread), cho phép nhiều dòng mã lệnh được xử lý độc lập, với hệ điều hành quản lý việc thực thi các luồng đó trên bất kỳ lõi bộ xử lý có sẵn nào trong máy. Các hệ điều hành cũng cung cấp hỗ trợ để thực hiện I/O, với các cơ chế được cung cấp để cho phép I/O được thực hiện theo cách có thể mở rộng với nhiều thao tác I/O “đang hoạt động” tại bất kỳ thời điểm cụ thể nào. Sau đó, các ngôn ngữ lập trình và các framework có thể cung cấp nhiều mức độ trừu tượng khác nhau trên nền tảng hỗ trợ cốt lõi này.
.NET cung cấp hỗ trợ đồng thời và song song hóa như vậy ở nhiều cấp độ trừu tượng, cả thông qua các thư viện và được tích hợp sâu vào C#. Một class Thread nằm ở cuối hệ thống phân cấp và đại diện cho một thread của hệ điều hành, cho phép các nhà phát triển tạo các thread mới và sau đó tham gia với chúng. ThreadPool nằm phía trên đầu các thread, cho phép các nhà phát triển suy nghĩ về các hạng mục công việc được lên lịch không đồng bộ để chạy trên một nhóm thread, với việc quản lý các thread đó (bao gồm cả việc thêm và xóa các thread khỏi nhóm cũng như chỉ định các đầu mục công việc cho các chủ đề đó) còn lại trong thời gian chạy. Task sau đó cung cấp một cách biểu diễn thống nhất cho bất kỳ hoạt động nào được thực hiện không đồng bộ và có thể được tạo và kết hợp theo nhiều cách; ví dụ: Task.Run cho phép lập lịch trình một nhiệm vụ chạy trên ThreadPool và trả về một Task để thể hiện kết quả cuối cùng của công việc đó, trong khi đó Socket.ReceiveAsync trả về một Task (hoặc ValueTask) thể hiện kết quả cuối cùng hoàn thành I/O không đồng bộ để đọc dữ liệu đang chờ xử lý hoặc trong tương lai từ Socket. Một loạt các synchronization primitive được cung cấp để điều phối các hoạt động đồng bộ và không đồng bộ giữa các thread và hoạt động không đồng bộ và vô số API cấp cao hơn được cung cấp để dễ dàng triển khai các mẫu xử lý đồng thời phổ biến, ví dụ: Parallel.ForEach và Parallel.ForEachAsync giúp dễ dàng xử lý song song tất cả các thành phần của một chuỗi dữ liệu.
Hỗ trợ lập trình không đồng bộ cũng là một tính năng first-class của ngôn ngữ lập trình C#, cung cấp các từ khóa async và await giúp dễ dàng viết và soạn thảo các hoạt động không đồng bộ trong khi vẫn tận hưởng đầy đủ lợi ích của tất cả cấu trúc luồng điều khiển mà ngôn ngữ này cung cấp .