나는 완전히 BackgroundWorker
을 1 년 넘게 사용하고 있으며 실제로 깊은 곳에서 알고 있습니다.
방금 Throw New Exception("Test")
에 DoWork
을 입력하면 My RunWorkerCompleted
에 e.Error
이 걸리지 않습니다. 그러나 처리되지 않은 예외가 발생했습니다. 따라서 DoWork
을 잡는 것이 가장 좋은 습관이 아니기 때문에 e.Error
은 아무런 의미가 없습니다.
새 을 새로 만들려고 시도하면 BackgroundWorker
, e.Error
은 RunWorkerCompleted
으로 성공적으로 처리됩니다. 내 복잡한 BackgroundWorker
에 잘못된 것이 있어야합니다.
Google 검색 및 디버깅 후 며칠간 오류가 발생했습니다. 내 RunWorkerCompleted
이 발견 :
- 확인
e.Error
첫째, 다음 e.Cancelled
그리고 마지막으로 e.Result
- 의
e.Result
e.Cancelled = True
경우를 얻을하지 마십시오.null
(또는 Nothing
)되지 않습니다 e.Result
e.Error
경우
- 내가 그리워 곳입니다 ** **
을하지 마십시오. e.Error
이 null
(또는 Nothing
)이 아닌 경우 e.Result
을 사용하려고하면 처리되지 않은 예외가 발생합니다.
업데이트 : e.Result
에서 그것은, e.Error
첫째, 가지고있는 경우 오류를 확인하기 위해 다음 그들이 DoWork
에서 같은 예외를 다시 throw합니다 속성 .NET 디자인을 얻을. 그렇기 때문에 처리되지 않은 예외는 RunWorkerCompleted
에 있지만 실제로 예외는 DoWork
에서 온 것입니다. 당신은 쉽게 할 수
Dim ThreadInfos as Dictionary(Of BackgroundWorker, YourObjectOrStruct)
을 : 모든 DoWork, ProgressChanged 및 RunWorkerCompleted에 그 접근 객체, 다음과 같이 사용을 원하는 경우에
If e.Error IsNot Nothing Then
' Handle the error here
Else
If e.Cancelled Then
' Tell user the process canceled here
Else
' Tell user the process completed
' and you can use e.Result only here.
End If
End If
: 여기
는 RunWorkerCompleted
에서 할 수있는 최선의 방법입니다 원하는 위치로 ThreadInfos(sender).Field
에 액세스하십시오.
그럴 겁니다. 물론 DoWork 메서드에서 예외를 catch하고 적절하게 대응할 수 있습니다 (UI를 업데이트하려는 경우 Control.Invoke를 사용하는 것을 기억하십시오). 그러나 RunWorkerCompleted는 실제로 더 간단합니다. –
이 해결책을 찾고 있습니다. 새 예외()를 던질 때 내 RunWorkerCompleted가 실행되지 않지만 처리되지 않은 예외가 발생했습니다. DoWork를 잡는 것이 진정한 해결책은 아닙니다. 내 BackgroundWorker에 잘못된 것이 있어야합니다. – CallMeLaNN
저는 방금 내 앱이 실행되지 않고 방금 종료 된 이유를 알아 내려고 지난 7 시간을 보냈습니다. 제대로 잡히지 않은 BackgroundWorker에서 오류가 발생했기 때문입니다. +1 당신과 나는 맥주도 마땅하다고 생각합니다 :-) – EvilDr