RunWorkerCompleted 事件中调用抛出的后台工作异常
Background worker Exception Thrown By Invocation in the RunWorkerCompleted Event
好的,我已经 BackgroundWorker1
下载了一系列文件来配置我的数据库,这 确实 在正常的表单加载事件下工作,并且运行良好在 backgroundworker 中——我使用了一个消息框来显示字符串的内容,它们是正确的。
但是我收到一个错误:
System.Reflection.TargetInvocationException occurred Message: A first
chance exception of type 'System.Reflection.TargetInvocationException'
occurred in mscorlib.dll Additional information: Exception has been
thrown by the target of an invocation.
在我的 BackgroundWorker1_RunWorkerCompleted
- 这对我来说有点奇怪,因为我是一个自学成才的编码员并且只在 .DoWork 中遇到过这个问题。
相关代码如下:
Public Function GetRemoteFile(ByVal url As String) As String
' Create web request, and get its response.
Dim request As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
' Read the content from the stream.
Dim reader As StreamReader = New StreamReader(response.GetResponseStream())
Dim content As String = reader.ReadToEnd()
' Dispose of our managed types.
reader.Dispose()
Return content
End Function
Public Class MyParameters
Public _ServerIP As String
Public _DatabaseUserName As String
Public _RegisterKey As String
Public _AccessCode As String
Public _TargetUGPoints As String
End Class
Private Sub form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim args As New MyParameters
BackgroundWorker1.RunWorkerAsync(args)
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim args As MyParameters = DirectCast(e.Argument, MyParameters) 'Convert the generic Object back into a MyParameters object
'Ive removed the URLs from my code here for obvious reasons.
args._ServerIP = GetRemoteFile("https://")
args._DatabaseUserName = GetRemoteFile("https://")
args._ServerIP = GetRemoteFile("https://")
args._DatabaseUserName = GetRemoteFile("https://")
args._RegisterKey = GetRemoteFile("https://")
args._AccessCode = GetRemoteFile("https://")
args._TargetUGPoints = GetRemoteFile("https://")
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
' Called when the BackgroundWorker is completed.
Dim args As MyParameters = DirectCast(e.Result, MyParameters) 'Convert the generic Object back into a MyParameters object
serveriptxt.Text = args._ServerIP.ToString
databaseusertxt.Text = args._DatabaseUserName.ToString
My.Settings.ServerIP = args._ServerIP.ToString.ToString
My.Settings.UserName = args._DatabaseUserName.ToString
My.Settings.RegisterKey = args._RegisterKey.ToString
My.Settings.AccessCode = args._AccessCode.ToString
My.Settings.TargetUGPoints = args._TargetUGPoints.ToString
My.Settings.Save()
TabControl1.Visible = True
End Sub
你能看出我收到此错误的原因吗?正如我所说,后台工作人员本身确实完成了(或到达了子程序的末尾),它只是在 WorkerCompleted 事件中我收到了错误,并且它没有突出显示错误所在的行。
为了配合我的评论,我认为您需要在 DoWork
方法中分配 e.Result 一个值。它出错是因为您试图访问 RunWorkerCompleted
方法中不存在的内容。试试这个:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim args As MyParameters = DirectCast(e.Argument, MyParameters) 'Convert the generic Object back into a MyParameters object
'Ive removed the URLs from my code here for obvious reasons.
args._ServerIP = GetRemoteFile("https://")
args._DatabaseUserName = GetRemoteFile("https://")
args._ServerIP = GetRemoteFile("https://")
args._DatabaseUserName = GetRemoteFile("https://")
args._RegisterKey = GetRemoteFile("https://")
args._AccessCode = GetRemoteFile("https://")
args._TargetUGPoints = GetRemoteFile("https://")
e.Result = args
End Sub
当然我可能是错的,我现在无法访问 IDE 进行测试。
好的,我已经 BackgroundWorker1
下载了一系列文件来配置我的数据库,这 确实 在正常的表单加载事件下工作,并且运行良好在 backgroundworker 中——我使用了一个消息框来显示字符串的内容,它们是正确的。
但是我收到一个错误:
System.Reflection.TargetInvocationException occurred Message: A first chance exception of type 'System.Reflection.TargetInvocationException' occurred in mscorlib.dll Additional information: Exception has been thrown by the target of an invocation.
在我的 BackgroundWorker1_RunWorkerCompleted
- 这对我来说有点奇怪,因为我是一个自学成才的编码员并且只在 .DoWork 中遇到过这个问题。
相关代码如下:
Public Function GetRemoteFile(ByVal url As String) As String
' Create web request, and get its response.
Dim request As HttpWebRequest = DirectCast(WebRequest.Create(url), HttpWebRequest)
Dim response As HttpWebResponse = CType(request.GetResponse(), HttpWebResponse)
' Read the content from the stream.
Dim reader As StreamReader = New StreamReader(response.GetResponseStream())
Dim content As String = reader.ReadToEnd()
' Dispose of our managed types.
reader.Dispose()
Return content
End Function
Public Class MyParameters
Public _ServerIP As String
Public _DatabaseUserName As String
Public _RegisterKey As String
Public _AccessCode As String
Public _TargetUGPoints As String
End Class
Private Sub form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
Dim args As New MyParameters
BackgroundWorker1.RunWorkerAsync(args)
End Sub
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim args As MyParameters = DirectCast(e.Argument, MyParameters) 'Convert the generic Object back into a MyParameters object
'Ive removed the URLs from my code here for obvious reasons.
args._ServerIP = GetRemoteFile("https://")
args._DatabaseUserName = GetRemoteFile("https://")
args._ServerIP = GetRemoteFile("https://")
args._DatabaseUserName = GetRemoteFile("https://")
args._RegisterKey = GetRemoteFile("https://")
args._AccessCode = GetRemoteFile("https://")
args._TargetUGPoints = GetRemoteFile("https://")
End Sub
Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
' Called when the BackgroundWorker is completed.
Dim args As MyParameters = DirectCast(e.Result, MyParameters) 'Convert the generic Object back into a MyParameters object
serveriptxt.Text = args._ServerIP.ToString
databaseusertxt.Text = args._DatabaseUserName.ToString
My.Settings.ServerIP = args._ServerIP.ToString.ToString
My.Settings.UserName = args._DatabaseUserName.ToString
My.Settings.RegisterKey = args._RegisterKey.ToString
My.Settings.AccessCode = args._AccessCode.ToString
My.Settings.TargetUGPoints = args._TargetUGPoints.ToString
My.Settings.Save()
TabControl1.Visible = True
End Sub
你能看出我收到此错误的原因吗?正如我所说,后台工作人员本身确实完成了(或到达了子程序的末尾),它只是在 WorkerCompleted 事件中我收到了错误,并且它没有突出显示错误所在的行。
为了配合我的评论,我认为您需要在 DoWork
方法中分配 e.Result 一个值。它出错是因为您试图访问 RunWorkerCompleted
方法中不存在的内容。试试这个:
Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
Dim args As MyParameters = DirectCast(e.Argument, MyParameters) 'Convert the generic Object back into a MyParameters object
'Ive removed the URLs from my code here for obvious reasons.
args._ServerIP = GetRemoteFile("https://")
args._DatabaseUserName = GetRemoteFile("https://")
args._ServerIP = GetRemoteFile("https://")
args._DatabaseUserName = GetRemoteFile("https://")
args._RegisterKey = GetRemoteFile("https://")
args._AccessCode = GetRemoteFile("https://")
args._TargetUGPoints = GetRemoteFile("https://")
e.Result = args
End Sub
当然我可能是错的,我现在无法访问 IDE 进行测试。