的Thread.Abort()
文檔指出它會拋出ThreadStateException
如果:什麼是暫停線程?
正被中止目前處於暫停狀態的線程。
究竟是什麼情況?
例如,如果線程位於Thread.Sleep(1000)
的中間,或者正在等待WaitHandle
,它是否被視爲「掛起」?
的Thread.Abort()
文檔指出它會拋出ThreadStateException
如果:什麼是暫停線程?
正被中止目前處於暫停狀態的線程。
究竟是什麼情況?
例如,如果線程位於Thread.Sleep(1000)
的中間,或者正在等待WaitHandle
,它是否被視爲「掛起」?
從閱讀的文檔,這是我的解釋,即「懸浮」在這種情況下不涉及使用Thread.Sleep
或WaitHandle
使用的,而是指線程狀態遇到使用廢棄Thread.Suspend
或等效的Windows API SuspendThread
時。
在此上下文中,掛起的線程是其執行已被明確暫停(或掛起)的線程,即其上下文不再被執行,但已被暫停以在稍後的時間點恢復。
此技術主要由調試器使用,不建議用於同步活動。這是MSDN文檔中明確了SuspendThread
:
此功能主要設計 供調試器使用。它不是 旨在用於線程 同步。上擁有一個 同步對象的線程調用SuspendThread ,諸如 互斥或關鍵部分,如果調用線程試圖 以獲得由一個掛起的線程擁有的同步對象 可以導致 死鎖。
所以我想這是你說普通的等待,睡覺或被阻止的線程不算作「暫停」的方式。但是,如果一個調試器暫停一個線程,然後另一個嘗試中止它......這可能會導致異常? – Qwertie 2011-05-04 17:43:47
@Qwertie:這是我對文檔的解釋,是的(調試器或其他能夠「掛起」線程的應用程序)。我更新了我的答案,直接回答你的問題。謝謝。 – 2011-05-04 17:44:30
暫停的線程是由於對Thread.Suspend
的調用而暫停的線程。
請參閱ThreadState
枚舉以獲取線程可以處於的狀態列表以及它如何到達那裏。
這方面的文件相當差。雖然完全不建議使用,但在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
。
更新
我原來的解釋是顯然不正確。幾乎明確的文件告訴你該解釋應該是什麼。
如果中止被稱爲一個線程 已經暫停,一個 ThreadStateException被拋出在 線程調用中止,並 AbortRequested被添加到被中止線程 的 的ThreadState屬性。在調用Resume之前,ThreadAbortException 不會引發到掛起的線程 中。
我會繼續,並留下我的答案,因爲它是切線相關的問題。
我認爲你的解釋是錯誤的。讀取'Thread.Abort'的文檔時,參考「Resume」時使用「suspended」這一事實意味着它處於掛起狀態,按照過時的Thread.Suspend所描述的行爲發生。 – 2011-05-04 18:57:05
是的,在仔細閱讀了一點之後,它確實在'Thread.Resume'的上下文中使用了。 – 2011-05-04 23:00:37
我決定保留我的答案,因爲我認爲它確實回答了問題的第二部分。我對文檔的原始解釋完全是關閉的......抱歉誤導。 – 2011-05-04 23:08:19
我相信它是指過時的['Thread.Suspend'](http://msdn.microsoft.com/en-us/library/system.threading.thread.suspend.aspx)。 – 2011-05-04 17:28:45