在RunWorkerCompleted事件中调用引发的后台工作程序异常

时间:2015-01-26 14:42:50

标签: vb.net

好的,我有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事件中,并且它没有突出显示错误的行。

1 个答案:

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