2010-11-08 15 views
3

在VS2008我有一個程序,它偶爾會出現消費者線程停止處理工作的問題。當我看到ThreadState說停止。什麼導致線程停止?我沒有阻止它。沒有例外。似乎很奇怪。 謝謝線程狀態已停止。沒有例外。這是怎麼回事?

+2

或許線程 「跑出來」?就像在自動停止的過程中一樣,並且優雅地終止......? – 2010-11-08 14:12:21

+0

你能發表一些代碼嗎?可能有多種原因,雖然可能沒有拋出異常,但是可能導致代碼退出。沒有什麼可看的東西很難說清楚! – 2010-11-08 14:13:31

回答

1

你確定沒有例外嗎?

A trycatch您的主線程不會捕獲工作線程上的異常。
在另一個線程的啓動方法中,有一個trycatch塊,然後在主線程上返回一個事件,或緩存具有啓動方法的對象上的屬性的異常,然後檢查該屬性是否在主線程。

希望這會有所幫助。

例如

class Worker 
{ 
    public Exception TheadException { get; private set; } 
    public void Start() 
    { 
     try 
     { 
      // Do your thing 
     } 
     catch (Exception ex) 
     { 
      TheadException = ex; 
     } 
    } 
} 

....

static void Main(string[] args) 
    { 
     Worker workerObject = new Worker(); 
     var workerThread = new System.Threading.Thread(workerObject.Start); 
     workerThread.Start(); 

     workerThread.Join(); 

     if (workerObject.TheadException != null) 
      Console.WriteLine("Thread failed with exception {0}", workerObject.TheadException); 
    } 
+0

+1謝謝,我在這裏學到了一些重要的東西。我一直主要使用ThreadPool進行線程處理,因爲大部分時間都是短暫的。在'BeginInvoke' /'EndInvoke'的情況下,只要你記得調用'EndInvoke',你就可以在線程之外處理異常。我有點懷疑,所以我必須運行你的代碼才能看到我自己。 :)我不知道爲什麼這樣做。對我來說,似乎並不一致(我寧願後一種處理方式),但現在我知道如何處理它。 – Dave 2010-11-08 15:06:22

+0

謝謝,我還沒有使用過ThreadPool,因爲我們使用的大多數/所有線程都將在UI或Windows服務的生命中生存,但很好的瞭解開始/結束調用。我必須看看:) – 2010-11-08 15:24:09