我知道我把进程放入for循环不正确的方法,我只是想知道如何更新进度条与安装,进度条相应地更新进程安装。安装开始后,在我的情况下,在后台运行安装后更新了进度条。
void _bw_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
progressbar1.Value = e.ProgressPercentage;
}
void _bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if ((e.Cancelled == true))
{
this.textblock1.Text = "Completed";
}
else if (!(e.Error == null))
{
this.textblock1.Text = ("Error :" + e.Error.Message);
}
else
{
progressbar1.Maximum = 100;
progressbar1.Minimum = 1;
progressbar1.Value = progressbar1.Maximum;
textblock1.Text = "Completed";
}
}
private readonly BackgroundWorker _bw = new BackgroundWorker();
public ControlPanelFinal()
{
InitializeComponent();
SilverLightInstall();
_bw.DoWork += _bw_DoWork;
_bw.RunWorkerCompleted += _bw_RunWorkerCompleted;
_bw.ProgressChanged += _bw_ProgressChanged;
_bw.WorkerReportsProgress = true;
}
void _bw_DoWork(object sender, DoWorkEventArgs e)
{
for (int i = 0; i <= 100; i++)
{
(sender as BackgroundWorker).ReportProgress(i);
Thread.Sleep(100);
}
string filepath = Path.Combine(Path.GetTempPath(), "Silverlight.exe");
Process p = new Process();
p.StartInfo.FileName = filepath;
p.StartInfo.Arguments = string.Format(" /q /i \"{0}\" ALLUSERS=1", filepath);
p.StartInfo.Verb = "runas";
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.Start();
}
答案 0 :(得分:1)
您是否可以执行此操作取决于您的Silverlight进程实际执行的操作以及它本身是否提供任何进度通知,例如通过写入stdout或为此目的提供某些进程间通信(IPC)机制。
例如,如果进程写入stdout,您可能会执行以下操作:
void _bw_DoWork(object sender, DoWorkEventArgs e)
{
BackgroundWorker worker = (BackgroundWorker)sender;
string filepath = Path.Combine(Path.GetTempPath(), "Silverlight.exe");
Process p = new Process();
p.StartInfo.FileName = filepath;
p.StartInfo.Arguments = string.Format(" /q /i \"{0}\" ALLUSERS=1", filepath);
p.StartInfo.Verb = "runas";
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.UseShellExecute = false;
p.Start();
string line;
while ((line = p.StandardOutput.ReadLine()) != null)
{
worker.ReportProgress(ConvertStdoutToProgress(line));
}
}
ConvertStdoutToProgress()
方法是您编写的一种假设方法,它可以解释流程中的输出行并将其转换为某个百分比的进度值。
(注意:重定向stdout以便您可以阅读它需要将UseShellExecute
设置为false
,但这可能会影响您的方案。我看到您正在设置Verb
属性我不确定如果没有UseShellExecute
设置为true
就可以使用。如果没有,那么显然你不能使用stdout重定向来取得进展。但是你可能无论如何......以上只是举例说明基本技术;无论如何,您必须根据具体情况对其进行自定义。
如果您无法从流程中可靠地检索进度信息,那么最好的方法是不要试图表明真正的进度。您仍然可以使用ProgressBar
,但将Style
属性设置为ProgressBarStyle.Marquee
。这将导致ProgressBar
显示活动的动画指示(具体指示因平台而异,但这通常是一个带有动画突出显示的填充栏,定期移动它)。