Progressbar无法正常工作的流程安装

时间:2015-02-04 06:05:30

标签: c# wpf xaml backgroundworker

我知道我把进程放入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();

}

1 个答案:

答案 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显示活动的动画指示(具体指示因平台而异,但这通常是一个带有动画突出显示的填充栏,定期移动它)。

完全完成,但可能高达80-90%),如果过程本身提前完成,则提前完成,如果定时循环在过程之前完成,则只需等待接近完全完成状态。但我不建议。我个人觉得这种进步指示令人讨厌,因为它意味着提供的信息并不存在。