私はBackgroundWorker何年にもわたって完全に使用しており、それを深く知っています。
つい最近、 Myは単に I が に入っているときに をキャッチRunWorkerCompletedしません。ただし、未処理の例外が発生しました。キャッチインはベストプラクティスではないため、意味がありません。e.ErrorThrow New Exception("Test")DoWorkDoWorke.Error
Formnewで newを作成しようとするとBackgroundWorker、正常e.ErrorにRunWorkerCompleted処理されました。私の複雑な中に何か問題があるはずBackgroundWorkerです。
グーグルとデバッグの数日後、エラーを試みます。私はこれを私の中で見つけましたRunWorkerCompleted:
e.Error最初に、次にe.Cancelled、最後にチェックするe.Result
e.Resultifを取得しないでくださいe.Cancelled = True。
e.Resultif e.Erroris not null(またはNothing) **を取得しない
** ここが懐かしい。e.Resultif e.Erroris not null(または)を使用しようとするとNothing、未処理の例外がスローされます。
更新:e.Result get プロパティ
の .NET 設計では、最初にチェックするように設計されています。エラーが発生した場合は、 .NETe.Errorから同じ例外が再スローされDoWorkます。そのため、未処理の例外RunWorkerCompletedが発生しますが、実際には例外は から発生しDoWorkます。
で行うベスト プラクティスは次の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
すべての DoWork、ProgressChanged、および RunWorkerCompleted にアクセスできるオブジェクトが必要な場合は、次のように使用します。
Dim ThreadInfos as Dictionary(Of BackgroundWorker, YourObjectOrStruct)
好きな場所に簡単にアクセスできThreadInfos(sender).Fieldます。