< p >
Thread.Abort()
文档表示,如果:
< blockquote >
正在被终止的线程当前处于暂停状态。
这是什么情况?
例如,如果线程正在执行Thread.Sleep(1000)
或正在等待WaitHandle
,它是否被认为是“暂停”?
Thread.Abort()
文档表示,如果:
< blockquote >
正在被终止的线程当前处于暂停状态。
这是什么情况?
例如,如果线程正在执行Thread.Sleep(1000)
或正在等待WaitHandle
,它是否被认为是“暂停”?
Thread.Sleep
或WaitHandle
的用法,而是指在使用过时的Thread.Suspend
或等效的Windows APISuspendThread
时遇到的线程状态。
在这个上下文中,一个被挂起的线程是指其执行被显式暂停(或挂起),即它的上下文不再被执行,但已被挂起以在稍后的某个时间恢复执行。在这方面,文档相当贫乏。虽然不建议使用Thread.Abort
,但在2.0及更高版本中,它要安全得多。它将安全地解除大多数.NET BCL阻塞调用,包括Thread.Sleep
、WaitHandle.WaitOne
、Monitor.Enter
等。我认为,在这种情况下,“挂起”的含义是一个被阻塞在其中一个这些调用内的线程。 我相信可以通过以下代码证明这一点。
static void Main(string[] args)
{
var thread = new Thread(() =>
{
try
{
Console.WriteLine("Thread blocking");
Thread.Sleep(Timeout.Infinite);
Console.WriteLine("Thread unblocked");
}
catch (ThreadAbortException)
{
Console.WriteLine("ThreadAbortException");
}
});
Console.WriteLine("Starting thread");
thread.Start();
Console.WriteLine("Waiting 1 second");
Thread.Sleep(1000);
Console.WriteLine("Aborting thread");
thread.Abort();
Console.WriteLine("Waiting for thread to end");
thread.Join();
Console.WriteLine("Thread ended");
Console.ReadLine();
}
将对Thread.Sleep
的调用替换为BCL中的其他阻塞调用,以查看哪些调用可以被Thread.Abort
“poke”。
更新
我的原始解释显然是错误的。文档几乎明确告诉您应该是什么解释。
如果在已暂停的线程上调用Abort,则在调用Abort的线程中引发ThreadStateException,并将AbortRequested添加到正在中止的线程的ThreadState属性中。直到调用Resume,才会在暂停的线程中抛出ThreadAbortException。
我将继续保留我的答案,因为它与问题有关。
Thread.Abort
的文档,"suspended" 一词用于 "Resume" 意味着在已过时的 Thread.Suspend
中处于暂停状态时才会发生所描述的行为。 - Jeff Yates
Thread.Suspend
。 - Brad Christie