跨线程操作无效VB.NET

And*_*ers 2 vb.net multithreading

我查看了网站,我发现与此主题有关的问题是针对C#(我维护的应用程序是用VB.NET编写的),所以如果我忽略了一个,我会道歉.

这是我调用我的线程的地方:

Private Sub saveBtn_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles saveBtn.Click
    If Not LoadedFilePath = String.Empty Then
        Dim oTrd = New Threading.Thread(AddressOf SaveData)
        oTrd.Start()
    End If
End Sub
Run Code Online (Sandbox Code Playgroud)

以下是方法:

Private Sub SaveData()
    SaveData(LoadedFilePath)
End Sub
Private Sub SaveData(ByVal filepath As String)
    If InvokeRequired Then
        Me.Invoke(New MethodInvoker(AddressOf SaveData))
    End If
    Try
        Me.Cursor = Cursors.WaitCursor
        Dim oSettings As New SettingsClass(filepath)
        Dim oEnc As New AES
        With oSettings
            //' Code removed for brevity
        End With
        oEnc = Nothing
        oSettings.SaveSettings()
        savedLbl.Visible = True
        If SavedTimeout IsNot Nothing Then
            Try
                SavedTimeout.StopEvent()
            Catch
            End Try
        End If
        SavedTimeout = New TimedEvent(Now.AddSeconds(5))
        SavedTimeout.StartEvent()
        Me.Cursor = Cursors.Default
    Catch ex As Exception
        MsgBox(ex.Message)
    End Try
End Sub
Run Code Online (Sandbox Code Playgroud)

保存功能工作得很好,但是当程序试图将光标切换回默认值时,我得到了交叉线程错误.我该怎么做才能解决这个问题?

Guf*_*ffa 5

您在所有者(GUI)线程中调用该方法的方法是错误的.如果需要调用,则不应执行方法中的其余代码.如果这样做,您将在GUI线程和后台线程中执行它,当您尝试从后台线程访问GUI元素时,您会收到跨线程错误.

调用应如下所示:

Private Sub SaveData(ByVal filepath As String)
   If InvokeRequired Then
      Me.Invoke(New MethodInvoker(AddressOf SaveData))
   Else
      ... the actual code
   End If
End Sub
Run Code Online (Sandbox Code Playgroud)

但是,为什么要在后台线程中启动该方法,当它必须在GUI线程中调用自己时呢?