这是我今天的代码。问题是进度条在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级。我昨天开始这样做了。
答案 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?
假设你必须做早餐。烤面包,煮一些鸡蛋。
答案 1 :(得分:1)
使用代码
System.Threading.Thread.Sleep(5000);
这将保持当前线程5秒。
但是:这不会改变您当前的问题。
如果我是你,我会调查backgroundworker。这有点棘手,但它可以真正帮助你。当前线程得到更新,而后台工作线程可以暂停。那么你会得到一个很好的形式,其中值得到更新。在当前线程中也不鼓励使用Sleep函数。