私はBackgroundWorker
何年にもわたって完全に使用しており、それを深く知っています。
つい最近、 Myは単に I が に入っているときに をキャッチRunWorkerCompleted
しません。ただし、未処理の例外が発生しました。キャッチインはベストプラクティスではないため、意味がありません。e.Error
Throw New Exception("Test")
DoWork
DoWork
e.Error
Form
newで newを作成しようとするとBackgroundWorker
、正常e.Error
にRunWorkerCompleted
処理されました。私の複雑な中に何か問題があるはずBackgroundWorker
です。
グーグルとデバッグの数日後、エラーを試みます。私はこれを私の中で見つけましたRunWorkerCompleted
:
e.Error
最初に、次にe.Cancelled
、最後にチェックするe.Result
e.Result
ifを取得しないでくださいe.Cancelled = True
。
e.Result
if e.Error
is not null
(またはNothing
) **を取得しない
** ここが懐かしい。e.Result
if e.Error
is 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
ます。