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级。我昨天就开始做了

VS进度条,当100%时该怎么做

几年前,你必须创建一个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函数。