2012-06-01 49 views
0

我在線程內部有線程,最後一個子線程只是掛起,現在不會拋出任何東西。我的代碼是這樣的:是什麼導致線程掛起,即使在20小時後也不會拋出任何東西

bool end = false; 

var t1 = new Thread(() => 
{ 
    // ... 

    var t2 = new Thread(() => 
    { 
     try 
     { 
      foreach(Data data in datas2) 
      { 
       foreach(SubData subdata in data.SubDatas) 
       { 
        var t3 = new Thread(() => 
        { 
         this.SaveData(subdata.RetrieveData()); 
        }); t3.Start(); 

        if (!t3.Join(1800000)) 
        { 
         t3.Abort(); 
         throw new TimeoutException("The execution of method is taking too long."); 
        } 
       } 
      } 
     } catch { throw; } 
     finally { end = true; } 
    }); t2.Start(); 
}); t1.Start(); 

它從來沒有經歷的t2finally塊,它不會引發任何錯誤。這裏發生了什麼?

我的代碼是在C#中,框架4,構建在Visual Studio 2010專業版。

請幫忙。提前致謝。


編輯:
謝謝大家對你的幫助。我找到了答案,它是

無限循環。

我們的產品爲這個愚蠢的bug停了一個星期。啊。似乎在我們的系統上有一個驗證,只會爲某些數據創建一個無限循環。感謝大家熱衷於解決這個問題。

+0

't3'完成執行嗎?你什麼時候使用'end'變量? – SimpleVar

+0

取決於在SaveData和RetrieveData中發生了什麼 –

+0

@YoryeNathan't3'沒有完成執行。我有另一個線程來檢查't2'是否已經結束。 'end'實際上是一個類型爲'private volatile bool'的類變量。 –

回答

0

我不知道這是否在你的情況下,問題....

然而,Thread.Abort的拋出一個例外(一個特殊的一個,即使你抓住它,一旦漁獲物和終於有完成後它會自動重新拋出,除非你清除中止)。如果SaveData和RetriveData中的代碼捕獲到異常,然後在catch中或者最終被阻塞,它將不會中止。

+0

你是指什麼意思,無論是在捕捉或最終被阻止_?什麼和如何被阻止? –

+0

如果它在等什麼?鎖定別的東西?在另一個線程上調用某些東西,或類似的東西。 –

0

SaveData或RetrieveData中可能存在一些我們不知道的內容。您可能會做出我們不知道的非常長/重複的I/O。

此外,我不認爲這段代碼是做你認爲它在做什麼。看我的//注意:下面:

  foreach(SubData subdata in data1.SubDatas) 
      { 
       var t3 = new Thread(() => 
       { 
        this.SaveData(subdata.RetrieveData()); 
       }); t3.Start(); 

       // NOTE: Here you are blocking each iteration of T2 
       // while T3 runs. There is no reason to be running 
       // another thread here- just call SaveData/RetrieveData 
       // from T2. Additionally, because this is executing in 
       // a double-nested loop, you might be doing this many, 
       // many times. I'd suggest looking into ThreadPool or TPL. 

       if (!t3.Join(1800000)) 
       { 
        t3.Abort(); 
        throw new TimeoutException("The execution of method is taking too long."); 
       } 
      } 
+0

我實際上是想在't3'運行時阻止't2',我只是把它放到另一個線程中,當它運行時間太長時,會向它添加'TimeoutException'。'RetrieveData'是一個連接到WCF服務的內存密集型進程。 –

相關問題