VS进度条,当100%时该怎么做
本文关键字:100% VS | 更新日期: 2023-09-27 18:17:42
这是我今天的代码。问题是进度条在1秒内从0到30%。
private void pictureBox1_Click(object sender, EventArgs e)
{
progressBar1.Value = 5;
System.Diagnostics.Process.Start("c:/installer.exe").WaitForExit();
progressBar1.Value = 10;
System.Diagnostics.Process.Start("c:/installer2.exe");
progressBar1.Value = 30;
}
}
我想在progressbar1(´s)
后面添加一个"sleep"或"wait"p。我只想澄清一件事,我在Visual studio中编码是0级。我昨天就开始做了
几年前,你必须创建一个BackgroundWorker对象来完成保持UI响应的工作。
几年来,我们有了async-await来完成这项工作。async-await函数看起来像同步代码,但是每当它看到await时,代码就会停止,直到等待的任务完成。与此同时,等待的线程有时间做其他事情,比如更新进度条,或者保持UI响应。一旦线程等待的Task完成,线程将继续执行await语句后的语句。
使用async-await唯一要做的就是声明你的事件处理程序async。完成这些之后,您可以调用其他异步函数并等待它们的结果。
启动进程后,可以等待Task.Delay(TimeSpan)。在这个方法期间,主线程没有做任何事情,所以它有时间做其他UI的事情。延迟完成后,它可以更新进度条,查看进程是否完成。
using System.Diagnostics;
private async void pictureBox1_Click(object sender, EventArgs e)
{
// start the progress, don't wait until finished yet:
var process1 = Process.Start("c:/installer.exe").WaitForExit();
while (!process1.HasExited)
{
// process not finished yet, increase progress bar and wait a while
this.progressBar1.Step();
await Task.Delay(TimeSpan.FromSeconds(0.2);
}
// if here, process1 has finished: we are halfway:
progressBar1.Value = (progressbar1.Minimum + progressBar1.Maximum)/2;
// start process 2
var process2 = Process.Start("c:/installer2.exe");
while (!process2.HasExited)
{
// process not finished yet, increase progress bar and wait a while
this.progressBar1.Step();
await Task.Delay(TimeSpan.FromSeconds(0.2);
}
// both processes finished; full progressbar:
this.progressBar1.Value = this.progressBar1.Maximum;
}
当然你可能会遇到安装需要很长时间的问题。如果该值变得太高,请考虑不再更新进度条
var halfWay = (progressbar1.Minimum + progressBar1.Maximum)/2;
while (!process1.HasExited)
{
if (this.progressBar1.Value < halfWay)
this.progressBar1.Step();
...
}
注意async await是由一个线程完成的。这不是多任务处理。Eric Lippert在stackoverflow上做了一个很好的类比:async/await -这种理解正确吗?
假设你要做早餐。烤一些面包,煮一些鸡蛋。
- 同步:开始烤面包。等到烤完。开始煮鸡蛋,等待鸡蛋煮熟。
- 异步但非并发:开始烤面包,在面包烤的同时开始煮鸡蛋。煮鸡蛋的时候,你可以做其他事情,比如泡茶。过了一会儿,你等到鸡蛋煮熟了,等到面包烤好了。这通常是async-await。
- 异步并发:请一个厨师烤面包,请一个厨师煮鸡蛋,等待两个厨师都煮好。在这里,烘烤和烹饪是由不同的工序完成的。这是最昂贵的方法
使用代码
System.Threading.Thread.Sleep(5000);
this将保持当前线程5秒。
然而:这不会改变你当前的问题。
如果我是你,我就去查一下背景工作者。这有点棘手,但确实能帮到你。当前线程得到更新,而后台工作线程可以暂停。然后你会收到一个很好的表单其中值被更新了。也不鼓励在当前线程中使用Sleep函数。