2010-05-11 120 views
4

我正在使用的應用程序使用線程池。這是基本的僞代碼。使用線程池的後臺線程異常處理

在主線程

foreach(Object obj in Component.GetObject())  
{  
    //Invoke the thread pool providing the call back (method to be called on the background// thread) and pass the object as the parameter. 
} 
//Wait for the threads to complete. 

的 「Component.GetObject」 將利用基本上返回CLR對象收率回報。該對象需要由線程上的兩個其他組件處理。所以我們調用提供回調方法的線程池(這將調用這兩個組件)。

如果在產生的線程上有一個異常,需要通知父線程,以便它可以跳出for循環(即停止產生更多的線程),等待產生的線程完成,然後處理異常。

根據我的閱讀,其中一種方法是在主線程上有一個「標誌」變量。如果產生的線程有異常,線程將使用鎖定機制設置變量。父線程會在產生新線程之前檢查「標誌」變量。

我想知道是否有更好的方法來處理這種情況。正在使用線程池,因爲如果「for」循環產生比線程池限制多的線程,它將管理線程隊列。

回答

0

我認爲標準的方法是拋出異常並讓處理線程池的代碼處理它。這在你的實現中是不可能的嗎?

即使處理異常,也沒有任何東西可以阻止您從其他線程之一拋出主線程。

//thread code 
try{ 
    //something 
} 
catch (IOException e){ 
    //handle your exception 

    //and then throw another one, that you can catch later 
    throw new ThreadFailedException() 
}