多线程允许提高应用程序的响应能力,如果应用程序在多处理器或多核心系统上运行,请提高其吞吐量。
进程和线程
进程是一个正在执行的程序。 操作系统使用进程来分隔正在执行的应用程序。 线程是作系统向其分配处理器时间的基本单元。 每个线程都有 一个计划优先级 ,并维护系统在暂停线程执行时用于保存线程上下文的一组结构。 线程上下文包含线程无缝恢复执行所需的所有信息,包括线程的一组 CPU 寄存器和堆栈。 多个线程可以在进程的上下文中运行。 进程的所有线程共享其虚拟地址空间。 线程可以执行程序代码的任何部分,包括当前由另一个线程执行的部件。
注释
.NET Framework 提供了一种方法,通过 应用程序域在进程中隔离应用程序。 (应用程序域在 .NET Core 上不可用)。有关详细信息,请参阅应用程序域文章的“应用程序域和线程”部分。
默认情况下,.NET 程序以单个线程启动,通常称为 主 线程。 但是,它可以创建其他线程以并行或并发方式与主线程执行代码。 这些线程通常称为 工作 线程。
何时使用多个线程
使用多个线程来提高应用程序的响应能力,并利用多处理器或多核系统来提高应用程序的吞吐量。
请考虑桌面应用程序,其中主线程负责用户界面元素并响应用户作。 使用工作线程执行耗时的作,否则会占用主线程并使用户界面无法响应。 还可以使用专用线程进行网络或设备通信,以更响应传入消息或事件。
如果程序执行可并行完成的作,则可以通过在单独的线程中执行这些作并在多处理器或多核心系统上运行程序来减少执行总执行时间。 在此类系统上,使用多线程可能会增加吞吐量,同时提高响应能力。
如何在 .NET 中使用多线程
从 .NET Framework 4 开始,利用多线程的建议方法是使用任务并行库 (TPL) 和并行 LINQ (PLINQ)。 有关详细信息,请参阅 并行编程。
TPL 和 PLINQ 都依赖于 ThreadPool 线程。 该 System.Threading.ThreadPool 类提供具有工作线程池的 .NET 应用程序。 还可使用线程池线程。 有关详细信息,请参阅 托管线程池。
最后,可以使用 System.Threading.Thread 表示托管线程的类。 有关详细信息,请参阅 使用线程和线程处理。
多个线程可能需要访问共享资源。 若要使资源保持未损坏的状态并避免争用条件,必须同步对资源的线程访问。 你可能还需要协调多个线程的交互。 .NET 提供了一系列类型,可用于同步对共享资源或坐标线程交互的访问。 有关详细信息,请参阅 同步基元概述。
请务必处理线程异常。 线程中未经处理的异常通常会终止进程。 有关详细信息,请参阅 托管线程中的异常。