【问题标题】:BackgroundWorker and Progressbar.Show()BackgroundWorker 和 Progressbar.Show()
【发布时间】:2010-06-10 08:29:28
【问题描述】:

我正在使用 Visual Studio 2010 和 C# 并尝试显示我的进度条,但它不起作用。

我听一个事件。如果发生这种情况,我想做一些工作并在执行此操作时显示进度条。

这就是我的工作:

static void Main(string[] args) {
  ProgressForm form = new ProgressForm();
  new FileWatcher(form).Start();
  Application.Run();
}

ProgressForm:
bgWorker.DoWork += new DoWorkEventHandler(bgWorker_DoWork);
private void bgWorker_DoWork(object sender, DoWorkEventArgs e) {
  this.Show();
  ....
}

但没有显示。为什么这不起作用?

谢谢 再见了。

【问题讨论】:

    标签: .net progress-bar backgroundworker


    【解决方案1】:

    您不应更改 UI 表单后台线程。这应该只从主线程完成。您可以在启动后台工作程序之前显示一个基本进度条并将其隐藏在后台工作程序 RunWorkerCompleted 事件处理程序中。要报告实际进展,您需要按照 Giorgi 的建议进行实施。

    【讨论】:

    • 这正是我想做的。但我注意 fileChangedEvent。这不是在主线程中提出的。
    • 我这样做: private void OnFileChanged(object source, FileSystemEventArgs e) { // 如果我在这里显示我的进度条,也没有任何反应 this.backgroundWorker.RunWorkerAsync(); }
    • “什么都没有发生”是什么意思?尝试启动后台worker backgroundWorker.RunWorkerAsync();并在下一行显示进度条。
    【解决方案2】:

    您不能使用 BGW 来显示表单,线程没有正确的状态。您必须使用 Thread 才能调用其 SetApartmentState() 方法将其切换到 STA。您还需要线程上的消息循环以使表单保持活动状态,这需要调用 Application.Run()。并且必须在该线程上创建表单。因此:

            var t = new Thread(() => Application.Run(new Form1()));
            t.SetApartmentState(ApartmentState.STA);
            t.Start();
    

    此表单的一个大问题是它不能由您的 UI 线程上的任何窗口拥有。让它倾向于消失在另一个应用程序的窗口后面。此外,您的 UI 线程仍然死机,它的窗口会在几秒钟后在其标题栏中显示“未响应”消息。

    正确的做法是反过来:在另一个线程上运行耗时的代码,BGW 将是一个非常好的选择。 UI 线程应该显示您的进度表。 BackgroundWorker.ReportProgress 是保持进度条更新的理想选择。

    【讨论】:

    • 感谢大家的帮助!现在它起作用了。主要问题是我这样做了:Application.Run();而不是这个:Application.Run(progressbarForm);我从我的 backgroundWorker 调用进度条,它显示了!再见于尔根
    【解决方案3】:

    为了从 BackgroundWorker 报告进度,您需要从 DoWork 事件处理程序中调用 ReportProgress 方法,并在 BackgroundWorker.ProgressChanged Event 的处理程序中显示进度

    【讨论】:

    • 另外我认为你应该将“ReportsProgress”属性设置为“true”。
    • 我也尝试了 progresschanged 事件。没发生什么事。但是我想先显示我的进度条,然后我想设置进度。
    • 我将 ReportsProgress 设置为 true,事件引发,但 show 没有执行任何操作。
    • 您应该在从主线程开始工作之前显示进度条,并且不要像 Adrian 在他的回答中所说的那样从后台线程触摸它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多