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(特别是由于位屏蔽)在确定特定和准确的状态时不可靠。我的问题是如何在终止后识别中止和完成的线程。。但是你写了整本圣经……)不是我写的…是我复印的