【问题标题】:Why does my progress bar disappear?为什么我的进度条消失了?
【发布时间】:2011-08-30 17:22:01
【问题描述】:

我以前见过这个问题,但我还没有看到适用于我的特定案例的问题的答案。我有一个在我的 VB 表单中运行的 BackgroundWorker,还有一个进度条和一些标签。我的表单上也有(如果重要的话)有一个 WebBrowser,但它不受线程的影响。

Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork

    Dim ints As Integer = Int(InputBox("What number to start at?"))
    Dim inte As Integer = Int(InputBox("What number to end at?"))
    ToolStripStatusLabel1.Text = "0 / " & inte - ints
    ToolStripProgressBar1.Maximum = inte
    ToolStripProgressBar1.Minimum = ints
    ToolStripProgressBar1.Style = ProgressBarStyle.Continuous
    Try
        For z As Integer = ints To inte

            ToolStripProgressBar1.Value = z
            ToolStripStatusLabel1.Text = z & "/" & inte
            'do some stuff here
    catch etc
    next

当循环运行时,有时它会停止并且进度条消失。知道为什么吗? 顺便说一句,我在那里做的唯一一件事就是运行一个 httpwebrequest 并处理字符串。

【问题讨论】:

  • 这段代码应该会引发 InvalidOperationException。不管你做了什么绕过它,你最好把它放回去。这在 Windows 中是非常非法的,绘画工件只是小问题。

标签: vb.net multithreading progress-bar


【解决方案1】:

这可能与您在 BackgroundWorkerDoWork 方法中设置用户界面对象 (ToolStripProgressBar1) 的值有关,该方法在其自己的线程中运行,与ToolStripProgressBar1所在的用户界面线程。

根据this MSDN page上的注释:

您必须小心不要在其中操作任何用户界面对象 你的 DoWork 事件处理程序。相反,与用户界面进行通信 通过 ProgressChanged 和 RunWorkerCompleted 事件。

BackgroundWorker 事件不会跨 AppDomain 边界封送。 不要使用 BackgroundWorker 组件执行多线程 在多个 AppDomain 中进行操作。

您应该做的是更改循环内的代码 (For z As Integer = ints To inte),以便调用 BackgroundWorkerReportProgress 方法,而不是直接设置 ValueText 属性。这会引发 ProgressChanged 事件,然后您可以在主 UI 线程上处理该事件。在这里,您可以安全地访问用户界面组件和对象的属性。

【讨论】:

  • 我想我明白了,但是我应该把“运行工人完成”放在哪里,这很重要吗?编辑:另外,使用 threading.thread 会更好吗?
  • 另外,如何将本地变量发送到事件?
  • @BrianBTB - Threading.Thread 无论如何都被BackgroundWorker 类“在幕后”使用。您仍然需要确保您不会与非 UI 线程中的 UI 组件进行交互。 RunWorkerCompleted 事件 应该 无论你做什么都应该被处理,因为它可以作为一种机制来处理DoWork 代码(在单独的线程中运行)引发的任何异常当DoWork 代码完成或被取消时执行所需的任何清理。 MSDN Page 上的示例应该会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
  • 2012-06-19
  • 2016-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多