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 进行测试。