在已中止和已完成的情况下,ThreadState
将为Stopped
。
如何区分它们?
答案 0 :(得分: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);
}
答案 1 :(得分:1)
注意如何声明ThreadState
枚举:
[FlagsAttribute]
public enum ThreadState { ... }
... Sinc它是[Flag]
这意味着一个线程可以处于多个状态。
MSDN, ThreadState Enumeration(我强调):
ThreadState定义了一组所有可能的执行状态 线程。一旦创建了一个线程,它就处于至少一个状态 直到它终止。在公共语言中创建的线程 运行时最初处于Unstarted状态,而外部线程 进入运行时的数据已经处于Running状态。一个 未启动的线程通过调用转换为Running状态 开始。 并非所有ThreadState值组合都有效;对于 例如,一个线程不能同时处于Aborted和Unstarted状态。
......接着说:
线程在给定时间可以处于多个状态。例如, 如果一个线程在调用Wait时被阻塞,另一个线程调用 在被阻塞的线程上中止,被阻塞的线程将在两者中 WaitSleepJoin和AbortRequested状态同时出现。在这 一旦情况,一旦线程从调用返回到Wait或者是 中断后,它将收到ThreadAbortException开始 则中止。
线程的Thread.ThreadState属性提供当前状态 一个线程。应用程序必须使用位掩码来确定是否 线程正在运行。由于Running的值为零(0),请测试 线程是否使用C#代码运行,如
(myThread.ThreadState & (ThreadState.Stopped | ThreadState.Unstarted)) == 0
答案 2 :(得分:0)
我能想到的唯一方法是将“已完成”标志设置为线程中的最后一个操作。如果未设置该标志,则可以假定它已中止。正如@Chris Shain在下面指出的那样,你必须要小心放置它,因为在线程中止的情况下,你的线程中会得到ThreadAbortException
,所以如果你把它放在finally
子句,即使在线程中止的情况下它也会被设置。
答案 3 :(得分:0)
线程中止时。你的线程上有ThreadAbortException。 这可以帮助您区分。