2010-03-29 4 views
6

질문 : .NET Backgroundworker를 다시 사용하면 예외를 주 스레드로 정상적으로 전달할 수있는 방법이 없습니까?.NET Backgroundworker - 예외를 주 스레드로 정상적으로 되돌릴 수있는 방법이 있습니까?

배경 : 나는 경우 (a)는 사용자에게 사용자 정의 응용 프로그램 예외가 다음 존재하지만, 프로그램을 종료하지 않으며,의 라인을 따라 간다 일반적인 예외 핸들을 내 윈폼 응용 프로그램에서 현재

  • (b)는 다음 존재하고 종료하는 어플리케이션의 다른 예외가
  • 난 그냥 응용 프로그램 및 프리젠 테이션의 아무 곳이나 적절한 예외를 던질 수 위의 좋은/처리가 일반적으로 처리하는 경우

답변

6

BackgroundWorker은 자동으로 예외를 되돌립니다. RunWorkerCompleted 이벤트를 연결하면 AsyncCompletedEventArgs.Error 속성에 있습니다.

원한다면이 이벤트 핸들러에서 예외를 래핑하고 다시 제 거할 수 있습니다. 프레임 워크에 bug이 있음을 명심하십시오. 그러면 프레임 워크에 "외부"예외가 발생하게됩니다. Invoke.

.NET 응용 프로그램의 백그라운드 스레드에서 발생하는 예외는 전체 프로세스를 중단시킬 수있는 커다란 오류입니다. 이를 처리 할 수있는 유일한 방법은 try-catch 블록에있는 모든 액티비티를 래핑하고 발생 된 예외를 저장하는 것입니다. 이는 정확히 BackgroundWorker의 기능입니다.

+0

@Aaronaught - "내부"예외가 throw되는 것을 의미합니까? (응답 주셔서 감사합니다) – Greg

+0

알았습니다! 방금 backgroundWorker1_RunWorkerCompleted 안에 새로운 BusinessException을 작성하고 innerException을 "null"로 설정했습니다. – Greg

1

없음 '이 외설 티.

대신 BackgroundWorker을 상속 e.Error을 확인하고 null가 아니라면 예외 핸들러를 실행 OnRunWorkerCompleted을 재정의하는 클래스를 만들 수 있습니다.

+0

감사합니다. – Greg

2

DoWork에서 호출 한 비동기 메서드가 예외를 throw하면 해당 예외는 RunWorkerCompleted 처리기에서 사용할 수있게됩니다. 거기서 처리 할 수 ​​있습니다. MSDN에서

private void backgroundWorker1_RunWorkerCompleted(
    object sender, RunWorkerCompletedEventArgs e) 
{ 
    // First, handle the case where an exception was thrown. 
    if (e.Error != null) 
    { 
     MessageBox.Show(e.Error.Message); 
    } 
    ... 
} 

: 예외가 비동기 작업 중에 발생하는 경우

는 클래스 오류 속성에 예외를 할당합니다. 클라이언트 응용 프로그램의 이벤트 처리기 대리자 에서 액세스하기 전에 오류 속성을 확인해야합니다. AsyncCompletedEventArgs; 그렇지 않으면 속성은 TargetInvocationException을 발생시키고 InnerException 속성은 오류를 포함합니다.

관련 문제