.net BackgroundWorker Runworker在组件中完成
我熟悉以下几点: “如果操作引发代码无法处理的异常,BackgroundWorker将捕获该异常并将其传递到RunWorkerCompleted事件处理程序,在该处理程序中,该异常将作为System.ComponentModel.RunWorkerCompletedEventArgs的错误属性公开。”。如果在Visual Studio调试器下运行,调试器将在引发未处理异常的DoWork事件处理程序中的某个点中断。“ 然而,我遇到了一个奇怪的故障 在我的组件中,有一个BackgroundWorker实例 即使该异常未在调试器中运行,工作进程仍无法处理该异常 即使是简化的代码也会产生未处理的异常(并且RunWorkerCompleted不会触发): 主要是RunWorkerComplete的代码:.net BackgroundWorker Runworker在组件中完成,.net,backgroundworker,.net,Backgroundworker,我熟悉以下几点: “如果操作引发代码无法处理的异常,BackgroundWorker将捕获该异常并将其传递到RunWorkerCompleted事件处理程序,在该处理程序中,该异常将作为System.ComponentModel.RunWorkerCompletedEventArgs的错误属性公开。”。如果在Visual Studio调试器下运行,调试器将在引发未处理异常的DoWork事件处理程序中的某个点中断。“ 然而,我遇到了一个奇怪的故障 在我的组件中,有一个BackgroundWorke
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偶数时。”