2011-05-04 233 views
4

Thread.Abort()文檔指出它會拋出ThreadStateException如果:什麼是暫停線程?

正被中止目前處於暫停狀態的線程。

究竟是什麼情況?

例如,如果線程位於Thread.Sleep(1000)的中間,或者正在等待WaitHandle,它是否被視爲「掛起」?

+0

我相信它是指過時的['Thread.Suspend'](http://msdn.microsoft.com/en-us/library/system.threading.thread.suspend.aspx)。 – 2011-05-04 17:28:45

回答

5

從閱讀的文檔,這是我的解釋,即「懸浮」在這種情況下不涉及使用Thread.SleepWaitHandle使用的,而是指線程狀態遇到使用廢棄Thread.Suspend或等效的Windows API SuspendThread時。

在此上下文中,掛起的線程是其執行已被明確暫停(或掛起)的線程,即其上下文不再被執行,但已被暫停以在稍後的時間點恢復。

此技術主要由調試器使用,不建議用於同步活動。這是MSDN文檔中明確了SuspendThread

此功能主要設計 供調試器使用。它不是 旨在用於線程 同步。上擁有一個 同步對象的線程調用SuspendThread ,諸如 互斥或關鍵部分,如果調用線程試圖 以獲得由一個掛起的線程擁有的同步對象 可以導致 死鎖。

+0

所以我想這是你說普通的等待,睡覺或被阻止的線程不算作「暫停」的方式。但是,如果一個調試器暫停一個線程,然後另一個嘗試中止它......這可能會導致異常? – Qwertie 2011-05-04 17:43:47

+0

@Qwertie:這是我對文檔的解釋,是的(調試器或其他能夠「掛起」線程的應用程序)。我更新了我的答案,直接回答你的問題。謝謝。 – 2011-05-04 17:44:30

3

暫停的線程是由於對Thread.Suspend的調用而暫停的線程。

請參閱ThreadState枚舉以獲取線程可以處於的狀態列表以及它如何到達那裏。

1

這方面的文件相當差。雖然完全不建議使用,但在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 不會引發到掛起的線程 中。

我會繼續,並留下我的答案,因爲它是切線相關的問題。

+0

我認爲你的解釋是錯誤的。讀取'Thread.Abort'的文檔時,參考「Resume」時使用「suspended」這一事實意味着它處於掛起狀態,按照過時的Thread.Suspend所描述的行爲發生。 – 2011-05-04 18:57:05

+0

是的,在仔細閱讀了一點之後,它確實在'Thread.Resume'的上下文中使用了。 – 2011-05-04 23:00:37

+0

我決定保留我的答案,因爲我認爲它確實回答了問題的第二部分。我對文檔的原始解釋完全是關閉的......抱歉誤導。 – 2011-05-04 23:08:19