обработка исключений в фоновых потоках с использованием пула потоков - PullRequest
4 голосов
/ 11 мая 2010

Приложение, над которым я работаю, использует пул потоков. Вот основной псевдокод.

На основной теме

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 с использованием возврата Yield. Этот объект должен обрабатываться двумя другими компонентами в потоках. Итак, мы вызываем пул потоков, предоставляющий метод обратного вызова (который вызовет два компонента).

Если есть исключение в порожденном потоке / с, родительский поток должен быть уведомлен, чтобы он мог выйти из цикла for (то есть прекратить порождение большего количества потоков), дождаться завершения созданных потоков и затем обработать исключение.

Основываясь на моем чтении, один из подходов будет иметь переменную "flag" в главном потоке. Если есть исключение в порожденном потоке, поток установил бы переменную, используя механизм блокировки. Родительский поток будет проверять переменную flag до появления новых потоков.

Я хотел бы знать, есть ли лучший подход для обработки этого сценария. Пул потоков используется, так как он управляет постановкой в ​​очередь потоков, если цикл «for» порождает больше потоков, чем предел пула потоков.

1 Ответ

0 голосов
/ 02 февраля 2011

Я думаю, что стандартный способ - просто выбросить исключение и позволить коду, который обрабатывает пул потоков, обрабатывать его. Разве это не возможно в вашей реализации?

Даже если исключение обработано, ничто не мешает вам перебросить один из них в ваш основной поток из другого потока.

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

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