【问题标题】:C# Update labels on custom progress bar windows formC# 更新自定义进度条窗口窗体上的标签
【发布时间】:2019-03-25 18:07:22
【问题描述】:

我正在创建一个模拟进度条的表单。

表单有一个进度条、一个带有标题的标签和另一个显示进度百分比的标签。

这个想法是,在开始循环之前,我使用该循环的元素计数创建表单的一个实例。循环的每次迭代都会调用一个方法来更新进度条和百分比标签。

进度条更新正常,但标题和百分比标签没有更新。我读过那是因为一切都在同一个线程中执行,并且 UI 没有更新。

这是我的代码:

主程序

...

MyProgressBar_Form pb = new MyProgressBar_Form("Test of progress bar", selectionBudget.Count);
pb.Show();

foreach (SelectedObject obj in selectionBudget) {
    pb.meterProgress();

    ...

}

pb.Close();

...

表单类

public partial class MyProgressBar_Form : Form {

    public MyProgressBar_Form(string title, int elems) {
        InitializeComponent();

        titleLbl.Text = title;

        progressBar1.Minimum = 0;
        progressBar1.Maximum = elems;
        progressBar1.Step = 1;

        this.Refresh();
    }

    public void meterProgress() {

        if (progressBar1.Value < progressBar1.Maximum) {
            progressBar1.Value++;

            double percentage = Math.Round((double)(progressBar1.Value / progressBar1.Maximum * 100), 2);
            progressLbl.Text = $"{percentage}%";

            this.Refresh();
        }
    }
}

【问题讨论】:

  • 尝试使用System.ComponentModel.BackgroundWorker
  • 另外,您能否将代码贴在您的主程序中,以便我提出更好的方法?

标签: c# multithreading forms


【解决方案1】:

在循环中尝试 Application.DoEvents()。

【讨论】:

  • 啊!不,永远不要那样做。 DoEvents() 仅用于向后兼容 VB6。这是向代码中引入几乎无法诊断并因此修复的错误的绝佳方式。
  • @Enigmativity 它很脏,但它很快并且有效。对于只包含 ProgressBar 的表单,不会有太多可能出错的地方。
  • @Enigmativity 过去我用过很多次,当时我不知道有什么更好的,也没有什么不好的事情发生在我身上。没有小狗或小猫受到伤害。它还为经典的 VB 社区提供了良好的服务,现在仍然如此(信不信由你,VB6 至今仍在使用)。
  • Jeff Atwood once said 放弃 DoEvents 以支持多线程是针对那些在胸前长出头发的硬汉,因为他们头上的头发掉了。 :-)
  • 所有这些都很好,但有一个学习曲线,并且不会阻止您改变共享状态并在脚下射击自己。然后你会到处放锁,自己死锁。如果你不知道自己在做什么,DoEvents 并不比其他的差(而且使用起来更快)。
猜你喜欢
  • 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
相关资源
最近更新 更多