.net BackgroundWorker Runworker在组件中完成

.net BackgroundWorker Runworker在组件中完成,.net,backgroundworker,.net,Backgroundworker,我熟悉以下几点: “如果操作引发代码无法处理的异常,BackgroundWorker将捕获该异常并将其传递到RunWorkerCompleted事件处理程序,在该处理程序中,该异常将作为System.ComponentModel.RunWorkerCompletedEventArgs的错误属性公开。”。如果在Visual Studio调试器下运行,调试器将在引发未处理异常的DoWork事件处理程序中的某个点中断。“ 然而,我遇到了一个奇怪的故障 在我的组件中,有一个BackgroundWorke

我熟悉以下几点:

“如果操作引发代码无法处理的异常,BackgroundWorker将捕获该异常并将其传递到RunWorkerCompleted事件处理程序,在该处理程序中,该异常将作为System.ComponentModel.RunWorkerCompletedEventArgs的错误属性公开。”。如果在Visual Studio调试器下运行,调试器将在引发未处理异常的DoWork事件处理程序中的某个点中断。“

然而,我遇到了一个奇怪的故障

在我的组件中,有一个BackgroundWorker实例

即使该异常未在调试器中运行,工作进程仍无法处理该异常

即使是简化的代码也会产生未处理的异常(并且RunWorkerCompleted不会触发):

主要是RunWorkerComplete的代码:

RaiseEvent UpdateComplete(Me, New AsyncCompletedEventArgs(e.Error, e.Cancelled, e.Result))
我需要组件通过公共事件公开工作异常

如果删除RaiseEvent调用,异常将由辅助进程处理,并通过e.Error进行访问

显然,引发事件会导致工作人员错过异常。这怎么可能呢

完整代码:

组成部分:

Private Sub workerDownloader_RunWorkerCompleted(ByVal sender As Object, ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)

        RaiseEvent UpdateComplete(Me, New AsyncCompletedEventArgs(e.Error, e.Cancelled, e.Result))

End Sub

Private Sub workerDownloader_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs)
        Throw New ArgumentException("Test")
End Sub
主机应用程序(WinForms):


可能是您的
e.Result
抛出了自己的异常

发件人:

您的
RunWorkerCompleted
事件 处理程序应始终检查
错误
取消
属性 在访问
结果之前
属性。如果引发异常 或者如果手术被取消了, 访问
结果
属性将引发 例外

具体来说,它将引发一个
targetingException

在您发布的代码中,您正在从通过
RunWorkerCompleted
事件传递的参数构造一个新的
AsyncCompletedEventArgs
对象。我不确定您这样做的理由是什么,但在我看来这是一个不必要的步骤,因为
RunWorkerCompletedEventArgs
继承自
AsyncComplete]dEventArgs
——因此您可以将
e
(一个
RunWorkerCompletedEventArgs
对象)传递给
UpdateComplete
事件:

Private Sub workerDownloader_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
        RaiseEvent UpdateComplete(Me, e)
End Sub

现在,以下是为什么这可能会解决您的问题(以及为什么我发布的MSDN链接是相关的):当前执行此操作的方式是,在调用
AsyncCompletedEventArgs
的构造函数时访问
e.Result
。在首先检查
e.Error
之前,通过访问其中的属性,您创建了一个场景,在评估要传递给
Upd的参数的过程中引发异常ateComplete
。由于此异常,您的
RaiseEvent
行无法完成它正在执行的操作;因此,
UpdateComplete
事件未被引发。

可能是您的
e.Result
引发了自己的异常

发件人:

您的
RunWorkerCompleted
事件 处理程序应始终检查
错误
取消
属性 在访问
结果之前
属性。如果引发异常 或者如果手术被取消了, 访问
结果
属性将引发 例外

具体来说,它将引发一个
targetingException

在您发布的代码中,您正在从通过
RunWorkerCompleted
事件传递的参数构造一个新的
AsyncCompletedEventArgs
对象。我不确定您这样做的理由是什么,但在我看来这是一个不必要的步骤,因为
RunWorkerCompletedEventArgs
继承自
AsyncComplete]dEventArgs
——因此您可以将
e
(一个
RunWorkerCompletedEventArgs
对象)传递给
UpdateComplete
事件:

Private Sub workerDownloader_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
        RaiseEvent UpdateComplete(Me, e)
End Sub

现在,以下是为什么这可能会解决您的问题(以及为什么我发布的MSDN链接是相关的):当前执行此操作的方式是,在调用
AsyncCompletedEventArgs
的构造函数时访问
e.Result
。在首先检查
e.Error
之前,通过访问其中的属性,您创建了一个场景,在评估要传递给
Upd的参数的过程中引发异常ateComplete
。由于此异常,您的
RaiseEvent
行无法完成它正在执行的操作;因此,您的
UpdateComplete
事件未被引发。

根据您对问题的更新进行更新。。。 我已经在C代码中模拟了这个问题,它看起来像是一个(跨线程?)问题,试图将结果从事件参数传递到AsyncCompletedEventArgs

传递错误和取消有效,但当我尝试传递结果对象时,结果对象无效。事件中是否需要结果对象

UpdateComplete(this, new AsyncCompletedEventArgs(e.Error, e.Cancelled, null));

根据您对问题的更新进行更新。。。 我已经在C代码中模拟了这个问题,它看起来像是一个(跨线程?)问题,试图将结果从事件参数传递到AsyncCompletedEventArgs

传递错误和取消有效,但当我尝试传递结果对象时,结果对象无效。事件中是否需要结果对象

UpdateComplete(this, new AsyncCompletedEventArgs(e.Error, e.Cancelled, null));

你能提供一个完整的代码示例吗?我不清楚什么是
RunWorkerComplete
。我已经更新了我的答案,更详细地解释了为什么我认为你会遇到这个问题。看一看,让我知道它是否有帮助。你能提供一个完整的代码示例吗?我不清楚
RunWorkerComplete
是什么。我e更新了我的答案,更详细地解释了为什么我认为你遇到了这个问题。看一看,让我知道它是否有帮助。事实并非如此,因为未处理的异常就是我抛出的异常(ArgumentException-“Test”)。我使用“if e.Error Isnothing Then MessageBox.Show(e.Error.ToString)“还有其他建议吗?@Sphynx,当您创建
AsyncCompleted偶数时。”