使用 .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 中停止线程,请使用线程同步技术手动实现协作取消。 例如,可以创建可变布尔字段 shouldStop
,并使用它来请求线程执行的代码以停止。 有关详细信息,请参阅 C# 参考中的 volatile 和 System.Threading.Volatile。
使用 Thread.Join 方法使调用线程等待线程终止停止。
如何:暂停或中断线程
你使用 Thread.Sleep 方法来暂停当前线程指定的时间。 可以通过调用该方法来中断阻塞的 Thread.Interrupt 线程。 有关详细信息,请参阅 暂停和中断线程。
线程属性
下表显示了一些 Thread 属性:
资产 | DESCRIPTION |
---|---|
IsAlive | 返回 true 线程是否已启动且尚未正常终止或中止。 |
IsBackground | 获取或设置一个布尔值,该值指示线程是否为后台线程。 后台线程类似于前台线程。 但是,后台线程不会阻止进程停止。 一旦属于进程的所有前台线程已停止,公共语言运行时将通过对仍然处于活动状态的后台线程调用 Abort 该方法结束进程。 有关详细信息,请参阅 前台和后台线程。 |
Name | 获取或设置线程的名称。 调试时最常用于发现单个线程。 |
Priority | 获取或设置一个由操作系统用来确定线程调度优先级的ThreadPriority值。 有关详细信息,请参阅 线程调度 和 ThreadPriority 参考资料。 |
ThreadState | 获取一个 ThreadState 值,该值包含线程的当前状态。 |