如何在进程结束前显示进度条

时间:2014-06-20 17:14:51

标签: c# wpf

当我尝试显示进度条直到外部进程结束时,我遇到了问题,这是我为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)方法,也尝试了循环,但似乎没有任何效果。 我是WPF的新手。所以,请尽量做一点简短。

谢谢, D.K。

2 个答案:

答案 0 :(得分:1)

你知道外部过程持续多久了吗?如果不这样做,您可以尝试在进度条上将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(){

}

答案 1 :(得分:0)

在上面的代码中,您正在启动一个进程但不等待它结束,因此执行您的调试器:

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();
}

上面提到的代码在语法上可能不正确。所以要寻找正确的语法。