Passing Values To and From Background Worker

☆樱花仙子☆ 提交于 2019-12-04 11:07:30

You can't change the signature of the DoWork event, but it contains a generic Object for you to use (called e.Argument). Define a custom class to contain all the data you want to move to and from the BackgroundWorker.

Option Strict On

Public Class Form1
  Class MyParameters
    Friend Input As Integer
    Friend Output As Integer
    Friend Message As String
  End Class

  Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim m As New MyParameters
    m.Input = 1
    ListBox1.Items.Add("Button1_Click")
    ListBox1.Items.Add("    Input: " & m.Input)
    BackgroundWorker1.WorkerReportsProgress = True
    BackgroundWorker1.RunWorkerAsync(m)   'this triggers BackgroundWorker1_DoWork. When finished, BackgroundWorker1_RunWorkerCompleted() is raised
  End Sub

  Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
    Dim m As MyParameters = DirectCast(e.Argument, MyParameters) 'Convert the generic Object back into a MyParameters object
    m.Message = "Progress report"
    BackgroundWorker1.ReportProgress(50, m) 'this triggers BackgroundWorker1.ProgressChanged. N.B. We could actually use a different class here, but we'll re-use the same class for simplicity
    m.Output = m.Input + 1
    e.Result = m
    'fun continues at BackgroundWorker1_RunWorkerCompleted
  End Sub

  Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
    ListBox1.Items.Add("BackgroundWorker1_ProgressChanged")
    Dim m As MyParameters = DirectCast(e.UserState, MyParameters) 'Convert the generic Object back into a MyParameters object
    ListBox1.Items.Add("    " & m.Message & " " & e.ProgressPercentage.ToString)
  End Sub

  Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted
    ListBox1.Items.Add("BackgroundWorker1_RunWorkerCompleted")
    Dim m As MyParameters = DirectCast(e.Result, MyParameters) 'Convert the generic Object back into a MyParameters object
    ListBox1.Items.Add("    Output: " & m.Output)
  End Sub
End Class
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!