2010-05-11 7 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

표준 방법은 예외를 throw하고 스레드 풀을 처리하는 코드가 처리하도록하는 것이라고 생각합니다. 구현에서 이것이 가능하지 않습니까?

예외가 처리 되더라도 다른 스레드 중 하나에서 주 스레드로 하나를 버리지 못하게하는 것은 없습니다.

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

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