好的,我有BackgroundWorker1
下载一系列文件来配置我的数据库,这个确实在正常的表单加载事件下工作,并且它在后台工作中运行良好 - 我使用消息框显示字符串的内容,它们是正确的。
但我收到一个错误:
System.Reflection.TargetInvocationException发生消息:第一个 类型'System.Reflection.TargetInvocationException'的机会异常 发生在mscorlib.dll中附加信息:异常已经发生 由调用目标引发。
在我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事件中,并且它没有突出显示错误的行。
答案 0 :(得分:1)
要同意我的评论,我认为您需要在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进行测试。