【问题标题】:BackgroundWorker control doesn't display the percentage progressBackgroundWorker 控件不显示百分比进度
【发布时间】:2016-01-15 10:17:24
【问题描述】:

我正在尝试在名为ProgressBar1 的进度条上显示百分比进度,现在创建了一个名为BkW1BackGrounWorker,并且我有以下代码:

Private Sub Form1_Load(sender as Object, e As EventArgs) Handles MyBase.Load
       BKW1.RunWorkerAsync()
End Sub

Private Sub BKW1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BKW1.DoWork
      ExternalClass.MyFunction() 'This function is located in another class
End Sub

Private Sub BKW1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BKW1.ProgressChanged
      Invoke(Sub()
               ProgressBar1.Value = e.ProgressPercentage
             End Sub)
End Sub

现在我的ExternalClass.MyFunction() 遍历DataTable 上的所有可用记录,仅此而已。为什么你的 BackGroundWorker 不在我的 ProgressBar1 上显示百分比?我应该在我的外部函数中插入一些参考吗?

【问题讨论】:

    标签: .net vb.net progress-bar backgroundworker percentage


    【解决方案1】:

    您必须指定 BackgroundWorker 实际显示进度(所以在 Form_Load 中):

    BKW1.WorkerReportsProgress= True
    

    然后你必须实际告诉它在DoWork 方法中报告进度(这会触发ProgressChanged 事件):

    BKW1.ReportProgress(x)
    

    因此,您可能需要获取ExternalClass 来引发ProgressChanged 事件并在那里调用此行。这是一个简化的例子:

    Public Class ExternalClass
        Public Event ProgressChanged(percentage As Integer)
    
        Public Function MyFunction() As Boolean
            For i As Integer = 0 To 100
                'do something
                'report the progress
                RaiseEvent ProgressChanged(i)
            Next
            Return True
        End Function
    End Class
    
    Private Sub BackgroundWorker1_DoWork(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim MyExternalClass As New ExternalClass
        AddHandler MyExternalClass.ProgressChanged, Sub(x) ExternalClass_ProgressChanged(x)
        MyExternalClass.MyFunction
    End Sub
    
    Private Sub ExternalClass_ProgressChanged(percentage As Integer)
        BackgroundWorker1.ReportProgress(percentage)
    End Sub
    
    Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.value = e.ProgressPercentage
    End Sub
    

    请注意,您实际上不需要在 BKW1_ProgressChanged 事件中调用该方法,因为它在 UI 线程上运行。这就是BackgroundWorker使用起来更方便的原因。

    【讨论】:

    • 所以我应该在我的 ExternalClass.MyFunction() 中执行 BKW1.ReportProgress(x)?
    • 否 - 在该类中引发您在表单中处理的事件。我已经发布了一些示例代码
    • 好吧,现在事件被触发,但是 e.ProgressPercentage 甚至返回 0 为什么?
    • 检查您在外部类中设置的值是否正确
    • 我发现了问题,有时我的数据表中有 1 条记录要迭代,所以 x(索引)等于 0。我还尝试设置我的 _ExternalClass.ProgressBar1.Maximum = DataTable。 Tables(0).Rows.Count 但百分比仍保持在 0
    【解决方案2】:

    您是否尝试在每个循环的 Sub BKW1_DoWork 中引发事件 ReportProgress()?否则不会触发 ProgressChanged 事件。

    这里有一些有趣的代码可能对你有所帮助:http://www.vb-helper.com/howto_net_use_backgroundworker.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-21
      • 2021-01-31
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 2011-01-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多