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

C# 如何识别线程是否已中止或完成,c#,.net,multithreading,C#,.net,Multithreading,在中止和完成两种情况下,ThreadState将被停止 如何区分它们?我能想到的唯一方法是将“完成”标志设置为线程中的最后一个操作。如果未设置该标志,则可以假定该标志已中止。正如@Chris Shain在下面指出的,您必须小心放置它的位置,因为在线程中止的情况下,您的线程中会出现ThreadAbortException,因此如果您将它放在finally子句中,即使在线程中止的情况下,它也会被设置。我能想到的唯一方法是设置一个“completed”标记为线程中的最后一个操作。如果未设置该标志,则可

在中止和完成两种情况下,
ThreadState
将被
停止


如何区分它们?

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

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

当线程中止时。您的线程上有ThreadAbortException。
这可以帮助您在线程中止时区分。

。您的线程上有ThreadAbortException。
这有助于您进行区分。

您最初的断言不正确。考虑:

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

你最初的断言是不正确的。考虑:

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
enum是如何声明的:

[FlagsAttribute]
public enum ThreadState { ... }
…Sinc它是一个
[Flag]
这意味着一个线程可以处于多种状态

(我补充强调):

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

…然后接着说:

一个线程在给定时间可以处于多个状态。例如, 如果一个线程在等待调用时被阻塞,而另一个线程调用 在被阻止的线程上中止,被阻止的线程将同时处于 WaitSleepJoin同时加入和中止请求的状态。在这个 在这种情况下,只要线程从Wait调用返回或 中断后,它将接收ThreadAbortException以开始 流产

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


注意
ThreadState
enum是如何声明的:

[FlagsAttribute]
public enum ThreadState { ... }
…Sinc它是一个
[Flag]
这意味着一个线程可以处于多种状态

(我补充强调):

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

…然后接着说:

一个线程在给定时间可以处于多个状态。例如, 如果一个线程在等待调用时被阻塞,而另一个线程调用 在被阻止的线程上中止,被阻止的线程将同时处于 WaitSleepJoin同时加入和中止请求的状态。在这个 在这种情况下,只要线程从Wait调用返回或 中断后,它将接收ThreadAbortException以开始 流产

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


将其放入finally子句将导致即使ThreadAbortException被抛出也会设置它。将其放入finally子句将导致即使ThreadAbortException被抛出也会设置它。您不应该中止线程,而且无论如何,您需要比ThreadState更好的状态跟踪。我建议使用
CancellationTokenSource
CancellationToken
Task
以获得最佳线程状态结果。@HenkHolterman:我还可以使用什么更好的状态跟踪?很简单。线程已完成,因为没有理智的人会中止线程:PYou不应该中止线程,而且无论如何,您需要比ThreadState更好的状态跟踪。我建议使用
CancellationTokenSource
CancellationToken
,和
Task
以获得最佳线程状态结果。@HenkHolterman:我还可以使用其他更好的状态跟踪吗?很简单。线程已完成,因为没有理智的人会中止线程:Pmy的问题是如何在终止后识别中止的线程和已完成的线程。。但是你写了整本圣经……)我没有写它…我复制/粘贴了;)。。。我不建议继续完全依赖ThreadState。如果可能,使用任务并检查CancellationToken以获得最佳结果。正如其他人所说,ThreadState(特别是由于位屏蔽)在确定特定和准确的状态时不可靠。我的问题是如何在终止后识别中止和完成的线程。。但是你写了整本圣经……)不是我写的…是我复印的