2012-01-03 3 views
11

시작 및 중지 단추가있는 응용 프로그램과 시작을 누른 후 백그라운드에서 실행 된 스레드가 있습니다. MVC와 TPL을 사용합니다.Wait()없이 TPL 예외 처리

Wait() 메소드를 호출하지 않으므로 TPL에서 예외를 어떻게 처리 할 수 ​​있습니까? 오류 메시지 상자를 표시해야하는 예외가있을 경우 즉시 던진 후에이 상자가 표시되어야합니다.

전 항상 백그라운드에서 단일 스레드가 있으므로 이전에 스레드를 중지하지 않고 시작을 누를 수 없습니다.

나는 좋은 패턴이나 모범 사례를 찾고 있습니다. try..catch를 스레드 안에 배치하고 각 캐치에서 이벤트를 호출하는 방법이 있지만 좋은 아키텍처 결정은 그런 접근 방법이 확실하지 않습니다.

답변

24

을, 당신은 경우에만 실행 계속 추가 할 수 있습니다 예외가 throw됩니다. UI 컨트롤을 사용할 수 있도록 UI 스레드에서 실행되도록 지정할 수도 있습니다.

task.ContinueWith(
    t => { var x = t.Exception; ...handle exception... }, 
    CancellationToken.None, 
    TaskContinuationOptions.OnlyOnFaulted, 
    TaskScheduler.FromCurrentSynchronizationContext() 
); 
+0

정말 멋진 기능입니다! 감사합니다 – Archeg

+0

@Archeg 여러분을 환영합니다. –

3

높은 수준에서 Wait 메서드는 간단히 Exception을 취합니다. 백그라운드 스레드에서 발생하여 다른 Exception 유형으로 래핑하고 다시 브로드 캐스트합니다. 따라서 로직 코드를 둘러싸는 표준 try/catch 블록을 사용하여 배경 스레드의 원래 Exception을 관찰 할 수 있습니다.

2

작업 (백그라운드 스레드에서)에서 예외를 처리하는 데 아무런 문제가 없습니다. 당신이 예외의 경우에 UI를 표시해야하는 경우 디스패처 (당신은 WPF 나 실버 라이트 사용하고있는 가정)를 사용할 수 있습니다 : 당신이 Tasks를 사용하는 경우 http://msdn.microsoft.com/en-us/magazine/cc163328.aspx