如何识别线程是否已中止或完成

时间:2012-06-15 18:11:57

标签: c# .net multithreading

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

如何区分它们?

4 个答案:

答案 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。 这可以帮助您区分。