如何确定线程是否已中止或完成

本文关键字:何确定 线程 是否 | 更新日期: 2023-09-27 18:37:25

在中止和完成的情况下,ThreadState将被Stopped

如何区分它们?

如何确定线程是否已中止或完成

您原来的断言不正确。 考虑:

public static void TestThreadAbort()
{
    var t = new Thread(() => Thread.Sleep(50000));
    t.Start();
    t.Abort();
    Thread.Sleep(50);
    // Prints "Aborted"
    Console.WriteLine(t.ThreadState);
}

请注意ThreadState枚举是如何声明的:

[FlagsAttribute]
public enum ThreadState { ... }

。Sinc 这是一个[Flag]这意味着线程可以处于多种状态。

MSDN,ThreadState Enumeration(由我添加的强调):

ThreadState 定义了一组所有可能的执行状态 线程。创建线程后,它至少处于一种状态 直到它终止。在公共语言中创建的线程 运行时最初处于"未启动"状态,而外部线程 进入运行时的已处于"正在运行"状态。一 未启动的线程通过调用转换为正在运行状态 开始。并非所有 ThreadState 值的组合都有效;对于 例如,线程不能同时处于"已中止"和"未启动"状态

。然后继续说:

一个线程在给定时间可以处于多个状态。例如 如果一个线程在调用 Wait 时被阻塞,而另一个线程调用 在被阻塞的线程上中止,被阻塞的线程将位于 WaitSleepJoin 和 AbortRequest 同时处于状态。在此 的情况下,一旦线程从对 Wait 的调用返回,或者 中断,它将收到线程中止异常开始 中止。

线程的 Thread.ThreadState 属性提供当前状态 的线程。应用程序必须使用位掩码来确定是否 线程正在运行。由于"正在运行"的值为零 (0),因此请测试 线程是否正在使用 C# 代码运行,例如

(myThread.ThreadState & (ThreadState.Stopped | ThreadState.Unstarted)) == 0

当线程中止时。您的线程上会出现 ThreadAbortException。这可以帮助您区分。

我能想到的唯一方法是将"已完成"标志设置为线程中的最后一个操作。 如果未设置该标志,则可以假定它已中止。 正如 @Chris Shain 在下面指出的那样,你必须小心放置它的位置,因为在线程中止的情况下,你的线程中会得到一个ThreadAbortException,所以如果你把它放在 finally 子句中,即使在线程中止的情况下,它也会被设置。