using System.Windows.Threading;
Dispatcher.CurrentDispatcher.Invoke(new System.Action(() => ProgressBar1.Value = value));
您有时可以在做其他工作的同时使用上面的代码来更新 UI。不过,您需要一些方法来以数字方式跟踪进度。
如前所述,由于您将主线程与处理捆绑在一起,因此您无法在同一线程上更新 UI。上面的内容节省了一小部分时间来执行此操作。唯一的其他方法是后台工作人员,尽管对于您的情况来说这可能是矫枉过正。
编辑(在单独的表单上显示)
您是否将进度条上的修饰符设置为公开?该解决方案可以很好地在单独的窗口中显示进度,并且可以正确更新。
private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.progressBar1.Maximum = 1000;
f2.Show();
for(int i = 0; i < 1000; i++)
{
Thread.Sleep(10);
f2.progressBar1.Value++;
}
}
请注意,进度窗口的 UI 将被锁定,直到底层进程完成。我刚刚对此进行了测试,它工作正常。
更新同一表单上的进度,但来自不同的类
您需要传递进度条的引用,以便您的方法知道它正在更新什么。
}
private void button1_Click(object sender, EventArgs e)
{
Class1 c = new Class1();
progressBar1.Maximum = 1000;
for(int i = 0; i < 1000; i++)
{
Thread.Sleep(10);
c.IncreaseProgress(progressBar1);
}
}
}
class Class1
{
public void IncreaseProgress(ProgressBar p)
{
p.Value++;
}
}
不过,上述两种方法都会在更新时锁定 UI。使用 BackgroundWorker 来避免这种情况。不过,此解决方案在快速而肮脏的实用程序中运行良好。