VS进度条,100%做什么

时间:2015-10-14 10:30:04

标签: c# visual-studio

这是我今天的代码。问题是进度条在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”o“wait”

聚苯乙烯。我只是想清除一件事,在Visual Studio中编码时我是0级。我昨天开始这样做了。

2 个答案:

答案 0 :(得分:2)

几年前,你必须创建一个BackgroundWorker对象来完成这项工作,以保持你的UI响应。

几年以来,我们有异步 - 等待可以完成这项工作。 async-await函数看起来像同步代码,但只要它看到await,代码就会停止,直到它等待的任务完成为止。同时,等待的线程有时间做其他事情,比如更新进度条,或保持UI响应。一旦线程正在等待的任务完成,线程将在等待之后继续执行该语句。

使用async-await要做的唯一事情就是声明事件处理程序是异步的。完成后,您可以调用其他异步函数并等待其结果。

在您启动流程后,您可以等待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 - Is this understanding correct?

假设你必须做早餐。烤面包,煮一些鸡蛋。

  • 同步:开始烘烤面包。等到烘烤完毕。开始煮鸡蛋,等到鸡蛋煮熟。
  • 异步但不兼并:开始烘烤面包,而面包是烘烤开始煮鸡蛋。虽然鸡蛋正在烹饪,你可以做其他事情,比如煮茶。过了一会儿,你要等到鸡蛋煮熟,等到面包烤好。这通常是async-await。
  • 异步和并发:雇一个厨师烤面包,雇一个厨师煮鸡蛋,等到两个厨师都吃完了。在这里,烘烤和烹饪由不同的线程完成。这是最昂贵的方法

答案 1 :(得分:1)

使用代码

System.Threading.Thread.Sleep(5000);

这将保持当前线程5秒。

但是:这不会改变您当前的问题。

如果我是你,我会调查backgroundworker。这有点棘手,但它可以真正帮助你。当前线程得到更新,而后台工作线程可以暂停。那么你会得到一个很好的形式,其中值得到更新。在当前线程中也不鼓励使用Sleep函数。