簡體   English   中英

VB.Net中BackgroundWorker的后期綁定問題

[英]Late Binding Issue with BackgroundWorker in VB.Net

我正在運行BackgroundWorker,並想報告其進度。 在下面的示例中,我創建一個測試列表,然后BackgroundWorker對其進行迭代。 問題在於“ sender.ReportProgress(i)”行。 如果啟用Option Strict,則由於后期綁定問題,它不喜歡我使用'i'。 有沒有其他方法可以對此進行編碼並避免該問題?

    Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        ' Configuring for Background Workers
        Control.CheckForIllegalCrossThreadCalls = False

        Dim MyList As New List(Of String)
        For a As Integer = 0 To 100
            MyList.Add(CStr(a))
        Next
    End Sub

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
        Dim bgw As New System.ComponentModel.BackgroundWorker
        bgw.WorkerReportsProgress = True
        bgw.WorkerSupportsCancellation = True
        AddHandler bgw.DoWork, AddressOf bgw_DoWork
        ' I create a BackgroundWorker here rather than add one in the toolbox so that I can specify the Handler and use different Handler routines for different part of a large program.

        Button1.Enabled = False
        Dim progress As New Progress(bgw)
        progress.ShowDialog()
        Button1.Enabled = True
    End Sub

    Private Sub bgw_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs)
        For i = 0 To MyList.Count -1
            Label1.Text = MyList(i)
            sender.ReportProgress(i)
            System.Threading.Thread.Sleep(200)
            Label1.Refresh()
        Next

    End Sub

End Class


Public Class Progress
    Private WithEvents _BGW As System.ComponentModel.BackgroundWorker

    Public Sub New(ByVal BGW As System.ComponentModel.BackgroundWorker)
        _BGW = BGW
        InitializeComponent()
    End Sub

    Private Sub frmProgress_Shown(sender As Object, e As System.EventArgs) Handles Me.Shown
        If Not IsNothing(_BGW) Then
            _BGW.RunWorkerAsync()
        End If
    End Sub

    Private Sub _BGW_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles _BGW.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
        Label1.Text = e.ProgressPercentage
    End Sub

    Private Sub _BGW_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles _BGW.RunWorkerCompleted
        Me.Close()
    End Sub
End Class
CType(sender, BackgroundWorker).ReportProgress(i)

另外,如果您想對其執行多項操作,請創建一個本地引用變量,如下所示:

Private Sub bgw_DoWork(sender As System.Object, e As System.ComponentModel.DoWorkEventArgs)

    Dim bgw As System.ComponentModel.BackgroundWorker = DirectCast(sender, System.ComponentModel.BackgroundWorker)

    ' ... now you can use "bgw" multiple times below instead of casting each time ...

    For i = 0 To MyList.Count -1
        Label1.Text = MyList(i)
        bgw.ReportProgress(i)
        bgw.SomethingElse()
        bgw.MoreStuff()
        System.Threading.Thread.Sleep(200)
        Label1.Refresh()
    Next
End Sub

顯然,在您的情況下,這不是必需的,只是供您參考...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM