我目前正在编写一个轻量级程序,它将许多命令行和其他外部进程整合到一个应用程序中。
目前,我面临着使用系统信息流程提取系统信息的挑战。
我已成功编码按钮以调用系统信息流程,并将输出重定向到文本字段。
我现在尝试的是在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;
}
答案 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)
如果您想要同时运行多个进程,那么您应该查看任务库。您可以使任务并行或串行运行,具体取决于您的系统资源。您还可以跟踪已完成的工作,这样您就可以显示已完成工作的百分比。