2010-05-11 87 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() 
}