使用线程和线程处理
借助 .NET,可以编写同时执行多个操作的应用程序。 可在单独的线程上执行可能妨碍其他操作的操作,这些线程是称为多线程处理或自由线程处理的进程 。
使用多线程处理的应用程序可以更快地响应用户输入,因为在单独的线程上执行处理器密集型任务时,用户界面将保持活动状态。 创建可扩展的应用程序时,多线程编程也很有用,因为可以随着负载的增加添加线程。
注意
如果需要更好地控制应用程序线程的行为,可以自己管理线程。 但是,由于出现了 System.Threading.Tasks.Parallel 和 System.Threading.Tasks.Task 类、并行 LINQ (PLINQ)、System.Collections.Concurrent 命名空间中的并发集合类以及基于任务(而非线程)概念的编程模型,多线程编程大大得到了简化。 有关详细信息,请参阅并行编程和任务并行库 (TPL)。
如何:创建并启动新线程
可通过创建 System.Threading.Thread 类的新实例来创建新线程。 将要在新线程上执行的方法名提供给构造函数。 要启动已创建的线程,请调用 Thread.Start 方法。 有关详细信息和示例,请参阅启动时创建线程并传递数据一文和 Thread API 引用。
如何:停止线程
要终止执行线程,请使用 System.Threading.CancellationToken。 它提供一种统一的方法以协作方式停止线程。 有关详细信息,请参阅托管线程中的取消。
有时无法以协作方式停止线程,因为它运行的第三方代码不是为协作取消而设计的。 在这种情况下,可能需要强制终止其执行。 若要强制终止线程的执行,可以在 .NET Framework 中使用 Thread.Abort 方法。 该方法在调用它的线程上引发 ThreadAbortException。 有关详细信息,请参阅销毁线程。 .NET Core 不支持 Thread.Abort 方法。 如果需要在 .NET Core 中强制终止第三方代码的执行,请在单独的进程中运行该代码,并使用 Process.Kill 方法。
System.Threading.CancellationToken 在 .NET Framework 4 之前的版本中不可用。 要停止旧版 .NET Framework 中的线程,请使用线程同步技术手动实现协作取消。 例如,可以创建 volatile 布尔字段 shouldStop
,并使用它来请求线程执行的代码停止。 有关详细信息,请参阅 C# 参考中的 volatile 和 System.Threading.Volatile。
使用 Thread.Join 方法使调用线程等待线程终止停止。
如何:暂停或中断线程
使用 Thread.Sleep 方法暂停指定时间内的当前线程。 可通过调用 Thread.Interrupt 方法来中断受阻止的线程。 有关详细信息,请参阅暂停并中断线程。
线程属性
下表列出了某些 Thread 属性:
Property | 说明 |
---|---|
IsAlive | 如果此线程已启动但尚未正常终止或中止,则返回 true 。 |
IsBackground | 获取或设置布尔值,该值指示线程是否为后台线程。 后台线程类似前台线程。 但后台线程不会阻止进程停止。 属于某个进程的所有前台线程均停止后,公共语言运行时通过对仍处于活动状态的后台进程调用 Abort 方法来结束进程。 有关详细信息,请参阅前台和后台线程。 |
Name | 获取或设置线程的名称。 最常用于在调试时查找各个线程。 |
Priority | 获取或设置由操作系统用来确定线程计划优先顺序的 ThreadPriority 值。 有关详细信息,请参阅计划线程和 ThreadPriority 引用。 |
ThreadState | 获取 ThreadState 值,该值包含线程的当前状态。 |