使用事件从另一个类的后台工作者更新UI

use*_*209 1 vb.net multithreading class backgroundworker

我正在尝试使用事件来更新来自不同类的后台工作程序的文本框.

除了我正在使用VB.NET之外,这个SO帖子中提到的问题也是如此.我正在尝试通过@ sa_ddam213实现第二个建议的解决方案.

我收到一个错误:"跨线程操作无效:控制'txtResult'从其创建的线程以外的线程访问."

这是我的代码:

Public Class DataProcessor
    Public Delegate Sub ProgressUpdate(ByVal value As String)
    Public Event OnProgressUpdate As ProgressUpdate

    Private Sub PushStatusToUser(ByVal status As String)
        RaiseEvent OnProgressUpdate(status)
    End Sub

    Public Sub ProcessAllFiles(ByVal userData As UserData)
        'Do the work
    End Sub
End Class

Public Class MainForm
    Private bw As New BackgroundWorker
    Private dp As New DataProcessor

    Private Sub bw_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
        Dim worker As BackgroundWorker = CType(sender, BackgroundWorker)

        If bw.CancellationPending = True Then
            e.Cancel = True
        Else
            dp.ProcessAllFiles(CType(e.Argument, UserData))
        End If
    End Sub

    Private Sub dp_OnProgressUpdate(ByVal status As String)
        txtResult.Text = status
    End Sub

    Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        bw.WorkerReportsProgress = True
        bw.WorkerSupportsCancellation = True
        AddHandler bw.DoWork, AddressOf bw_DoWork
        AddHandler bw.ProgressChanged, AddressOf bw_ProgressChanged
        AddHandler bw.RunWorkerCompleted, AddressOf bw_RunWorkerCompleted

        AddHandler dp.OnProgressUpdate, AddressOf dp_OnProgressUpdate
    End Sub
End Class
Run Code Online (Sandbox Code Playgroud)

谢谢大家!

One*_*Day 5

该事件仍然来自与UI不同的线程.您需要将唤醒委托给UI.我不检查,InvokeRequired因为我知道它来自工作线程.

Me是表单,Invoke请求代理将处理将数据带到UI线程的工作.在这里,我的Delegate Sub是一个lambda Sub而不是使用普通的Sub例程 - 更简单的设计.

Private Sub dp_OnProgressUpdate(ByVal status As String)
   'invoke the UI thread to access the control
   'this is a lambda sub
   Me.Invoke(Sub
               'safe to access the form or controls in here
               txtResult.Text = status
             End Sub)
 End Sub
Run Code Online (Sandbox Code Playgroud)