如何显示进度条,直到进程结束
本文关键字:结束 进程 何显示 显示 | 更新日期: 2023-09-27 18:09:39
当我试图显示进度条直到我为WPF窗口启动的外部进程结束时,我遇到了一个问题。
代码如下:
private void Button1_Click(object sender, RoutedEventArgs e)
{
Button1.IsEnabled = false;
Button1.Content = "Please Wait";
ProgressBar1.Visibility = Visibility.Visible;
if (a == 1 && b == 0)
{
var processStartInfo = new ProcessStartInfo(@"External Process Path 1");
processStartInfo.Verb = "runas";
try
{
Process.Start(processStartInfo);
}
catch (Win32Exception ex)
{
MessageBox.Show(ex.ToString(), "Run As",
MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
}
if (b == 1 && a == 0)
{
var processStartInfo = new ProcessStartInfo(@"External Process Patch 2");
processStartInfo.Verb = "runas";
try
{
Process.Start(processStartInfo);
}
catch (Win32Exception ex)
{
MessageBox.Show(ex.ToString(), "Run As",
MessageBoxButton.OK, MessageBoxImage.Exclamation);
}
}
Button2.IsEnabled = true;
ProgressBar1.Visibility = Visibility.Hidden; //This is what I want to toggle after process ends
}
我已经尝试过Thread.Sleep(time)方法和for-loop,但似乎没有任何工作。我是WPF的新手。所以,请尽量简短一点。
谢谢,位
您知道外部流程持续多长时间吗?如果你不这样做,你可以尝试在你的进度条上设置IsIndeterminate属性为true。这将显示连续的动画。当你的进程返回时,你可以再次将其设置为false以停止动画。
同样,在你的代码中,我认为你没有等待进程完成。您可以使用下面的代码来实现这一点:
Process p = Process.Start("IExplore");
p.WaitForExit();
请注意WaitForExit()会阻塞当前线程。结果应用程序将停止响应。为了保持UI的响应性,你可能会像下面这样在不同的线程上启动你的进程。
private void onClick_Handler(object sender, EventArgs e) {
//disable button here
Task.Factory.StartNew(() => {
Process p = Process.Start("IExplore");
p.WaitForExit();
//enable button here. make sure to do this on the UI thread
//since you're doing this in the code-behind you should have access
//to the dispatcher
Dispatcher.BeginInvoke((Action)OnUpdateUI);
});
}
private void OnUpdateUI(){
}
在上面的代码中,您正在启动一个进程,但没有等待它结束,因此调试器在执行您的:
Process.Star("Add Some Task");
,它跳转到下一条语句
button2.IsEnabled = true;
等等。因此,ProgressBar1对您来说是不可见的。
请先等待进程结束。写
Process.WaitForExit();
就在语句后面
Process.Start("Your already started task");
你也可以创建一个异步线程来并行运行。
的例子:
Task taskA = new Task( () => Console.WriteLine("Hello from taskA."));
taskA.Start();
taskA.Wait();
同样在上面的代码中,您只显示ProgressBar,但不随时间更新其值。因此,ProgressBar将只显示初始值。
对于ProgressBar,输入
ProgressBar ProgressBar1 = new ProgressBar();
ProgressBar1.Maximum = 100;
ProgressBar1.Minimum = 0;
Task.Start();
if( Task.Status == "Running")
{
ProgressBar1.Value = 50;
}
if( Task.Status == "completed")
{
ProgressBar1.Value =100;
}
else
{
ProgressBar.Value=0;
Task.Wait();
}
上面提到的代码可能在语法上不正确。所以一定要查找正确的语法