Thread.Abort()
文档说明如果出现ThreadStateException
:
正在中止的线程目前已暂停。
这到底是什么情况?
例如,如果主题位于Thread.Sleep(1000)
的中间位置,或等待WaitHandle
,是否会被视为“暂停”?
答案 0 :(得分:6)
通过阅读文档,我的解释是,在此上下文中“暂停”与使用Thread.Sleep
或WaitHandle
用法无关,而是指使用时遇到的线程状态已废弃的Thread.Suspend
或等效的Windows API SuspendThread
。
在此上下文中,挂起的线程是一个线程,其执行已被显式暂停(或暂停),即它的上下文不再被执行但已被暂停以便稍后恢复。
此技术主要由调试器使用,不建议用于同步活动。这在SuspendThread
上的MSDN文档中阐明:
此功能主要是设计的 供调试器使用。它不是 打算用于线程 同步。调用SuspendThread 在拥有一个的线程上 同步对象,例如 互斥或临界区,可以导致 如果调用线程尝试死锁 获取同步对象 由悬挂的线程拥有。
答案 1 :(得分:3)
暂停的帖子是因呼叫Thread.Suspend
而暂停的帖子。
请参阅ThreadState
枚举,了解线程可以处于的状态列表以及它如何到达。
答案 2 :(得分:1)
在这方面,文件很差。 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
“戳”。
<强>更新强>
我原来的解释是明显不正确。文档几乎明确地告诉你解释应该是什么。
如果在一个线程上调用Abort 已暂停,a 抛出ThreadStateException 调用Abort的线程,和 AbortRequested被添加到 线程的ThreadState属性 被流产。 ThreadAbortException 没有抛出悬挂的线程 直到调用Resume。
我会继续留下我的答案,因为它与问题切线相关。