【问题标题】:BackgroundWorker not updating GUI at other FormBackgroundWorker 不更新其他形式的 GUI
【发布时间】:2017-03-13 01:45:01
【问题描述】:

如上所述,我有一个运行子函数 DoHeavyWork() 的 BackgroundWorker。

 Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        If BackgroundWorker1.CancellationPending = True Then
            e.Cancel = True
        Else
            'DO HEAVY WORK
            DoHeavyWork()
        End If
    End Sub
 Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As System.ComponentModel.ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.Value = e.ProgressPercentage
        Label8.Text = e.ProgressPercentage.ToString() + " %"
    End Sub


Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

        If e.Cancelled = True Then
            ProgressBar1.Value = 0
            Label8.Text = ""
        ElseIf e.Error IsNot Nothing Then
            MessageBox.Show(e.Error.Message)
        Else
            MessageBox.Show("Completed!")
        End If
    End Sub

在这个子函数 DoHeavyWork() 中,有一些代码可以更新另一个表单的 GUI。

Private Sub DoHeavyWork()
For i As Integer = 1 To fresult_counter
  Dim fresult As New Button
                fresult.Name = "fresult_" & i
                fresult.Text = result(index_acc(i - 1)).ToString

                fresult.TextAlign = ContentAlignment.MiddleLeft
                fresult.Width = 265
                fresult.AutoSize = True
                fresult.BackColor = Color.White

                With fresult.FlatAppearance
                    .BorderColor = Color.White
                    .BorderSize = 2
                    .MouseDownBackColor = Color.DeepSkyBlue
                    .MouseOverBackColor = Color.DeepSkyBlue
                End With
                fresult.Anchor = AnchorStyles.Left
                fresult.FlatStyle = FlatStyle.Flat
                fresult.UseVisualStyleBackColor = False
                fresult.Location = New Point(0, 22 * (i - 1))
                Form1.TabControl2.TabPages(1).Controls.Add(fresult)
                BackgroundWorker1.ReportProgress(i)
 Next
 End Sub

问题是它没有更新 GUI,但进度条正在工作。我已经尝试从 BackgroundWorker 中获取代码集,它工作正常。是否有什么我没有设置来启用 BackgroundWorker 来更新 GUI?

【问题讨论】:

  • 这是因为它们在不同的线程上。进度条之所以有效,是因为它不在 UI 线程上,其他可能是...查看委托和调用,您会找到所需的内容。另外,您省略了有问题的主要代码,DoHeavyWork 中的内容,因为它可能正在尝试更改控件...
  • 谢谢你的建议,会调查的。
  • 您显然对使用BackgroundWorker 所做的研究很少。重点是做背景工作。与 UI 相关的任何事情都与后台工作完全相反。在您的情况下,您所做的一切都涉及 UI,因此您根本无法使用 BackgroundWorker
  • @jmcilhinney 很抱歉,我没有完全列出 DoHeavyWork 子功能,它仍然有进度条。我已经更新了它。就像你说的,我对BackgroundWorker确实不熟悉。
  • 正如我所说,UI = 前景。您根本无法使用BackgroundWorker 来做您想做的事情。它用于计算、数据检索文件处理等,而不是构建 UI。

标签: vb.net visual-studio visual-studio-2012 backgroundworker


【解决方案1】:

正如jmcilhinney所提到的,我的答案的解决方案很简单。

只要让 BackgroundWorker 在后台更新进度条即可。当它完成它的工作时,进度条将是 100,这意味着它已经完成了。

完成后,只需在 BackgroundWorker 完成时在子函数中添加更新 GUI 编码(在我的例子中:'Form1.TabControl2.TabPages(1).Controls.Add(fresult)'):

Private Sub BackgroundWorker1_RunWorkerCompleted(sender As Object, e As System.ComponentModel.RunWorkerCompletedEventArgs) Handles BackgroundWorker1.RunWorkerCompleted

        If e.Cancelled = True Then
            ProgressBar1.Value = 0
            Label8.Text = ""
        ElseIf e.Error IsNot Nothing Then
            MessageBox.Show(e.Error.Message)
        Else
            MessageBox.Show("Completed!")
            Form1.TabControl2.TabPages(1).Controls.Add(fresult)
        End If
    End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-10
    • 2017-11-08
    • 1970-01-01
    • 1970-01-01
    • 2013-10-26
    相关资源
    最近更新 更多