外部流程的进度条

时间:2011-08-12 06:08:56

标签: c# wpf visual-studio-2010

我目前正在编写一个轻量级程序,它将许多命令行和其他外部进程整合到一个应用程序中。

目前,我面临着使用系统信息流程提取系统信息的挑战。

我已成功编码按钮以调用系统信息流程,并将输出重定向到文本字段。

我现在尝试的是在WPF窗口的底部有一个进度条,因为加载系统信息需要一些时间。

由于我不知道如何从外部进程获得准确的持续时间,我试图使用Marquee样式。

我一直在关注stackoverflow(Windows Forms ProgressBar: Easiest way to start/stop marquee?)以及其他网站上的示例,但是无法确定将代码放在何处,以便在systeminfo运行时滚动进度条完成后停止。

我当前的代码(没有progressbar1.Style = ProgressBarStyle.Marquee;)在下面。

关于在何处放置代码或使用什么语法的任何建议都将非常感激。提前谢谢!

private void btnSystemInfo_Click(object sender, RoutedEventArgs e)
        {


            // Get system info
            Process info = new Process();
            info.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
            info.StartInfo.FileName = "C:\\Windows\\system32\\systeminfo.exe";
            info.StartInfo.Arguments = "-S " + context;
            info.StartInfo.UseShellExecute = false;
            info.StartInfo.CreateNoWindow = true;
            info.StartInfo.RedirectStandardOutput = true;

            info.Start();

            string infoOutput = info.StandardOutput.ReadToEnd();
            info.WaitForExit();

            // Write to the txtInfo text box
            txtInfo.Text = "System Info: " + infoOutput;
            txtInfo.Foreground = Brushes.Black;
            txtInfo.VerticalScrollBarVisibility = ScrollBarVisibility.Visible;

            // Switch to the info tab
            tabControl.SelectedIndex = 3;
        }

2 个答案:

答案 0 :(得分:4)

您需要做的是移动在BackgroundWorker线程中收集系统信息的代码,并在主UI线程中启动选取框。一旦从BackgroundWorker线程获得其工作已完成的信号,请停止选取框并在textBox中显示信息

void ButtonClickEvent()
{
    BackgroundWorker bg = new BackgroundWorker();
    bg.DoWork += new DoWorkEventHandler(MethodToGetInfo);
    bg.RunWorkerCompleted += new RunWorkerCompletedEventHandler(bg_RunWorkerCompleted);
    //show marquee here
    bg.RunWorkerAsync();
}

void MethodToGetInfo(Object sender, DoWorkEventArgs args)
{
    // find system info here
}

void bg_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs args)
{
    //this method will be called once background worker has completed it's task
    //hide the marquee
    //update the textbox

    //NOTE that this is not a UI thread so you will need BeginInvoke to execute something in the UI thread
}

答案 1 :(得分:0)

如果您想要同时运行多个进程,那么您应该查看任务库。您可以使任务并行或串行运行,具体取决于您的系统资源。您还可以跟踪已完成的工作,这样您就可以显示已完成工作的百分比。