0

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

如何区分它们?

4

4 回答 4

3

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

public static void TestThreadAbort()
{
    var t = new Thread(() => Thread.Sleep(50000));
    t.Start();
    t.Abort();
    Thread.Sleep(50);
    // Prints "Aborted"
    Console.WriteLine(t.ThreadState);
}
于 2012-06-15T18:24:36.270 回答
1

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

[FlagsAttribute]
public enum ThreadState { ... }

...因为它是一个[Flag]这意味着一个线程可以处于多个状态。

MSDN,ThreadState Enumeration(重点由我添加):

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

...然后继续说:

一个线程在给定时间可以处于多个状态。例如,如果一个线程在调用 Wait 时被阻塞,而另一个线程在被阻塞的线程上调用 Abort,则被阻塞的线程将同时处于 WaitSleepJoin 和 AbortRequested 状态。在这种情况下,一旦线程从 Wait 调用返回或被中断,它将收到 ThreadAbortException 以开始中止。

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

(myThread.ThreadState & (ThreadState.Stopped | ThreadState.Unstarted)) == 0
于 2012-06-15T18:35:48.953 回答
0

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

于 2012-06-15T18:14:57.517 回答
0

当一个线程被中止时。您在线程上获得 ThreadAbortException。这可以帮助您区分。

于 2012-06-15T18:16:39.693 回答