0

我正在构建安装程序项目,该项目需要从 Internet 下载许多安装文件(并行执行下载操作),然后开始一一安装文件。安装顺序并不重要。当一个文件完成下载后,它被插入到队列中,我有其他工作人员从这个队列文件中取出并一一安装。我实现了几乎所有东西,但在安装过程中遇到了问题。

我正在使用以下方法以静默模式安装下载的文件:

        private void Install()
        {
            var item = _installItems.Dequeue();

            item.ProgStage = ProgressStage.Install;
            RefreshPgBars();
            System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
           //insert psi arguments and file name here  

            System.Diagnostics.Process.Start(psi);//start installing
}

我使用后台线程调用此方法:

        Thread worker = new Thread(() => Install());
        worker.IsBackground = true;
        worker.Start();
        worker.Join();

好像Join方法不知道什么时候安装完成——代码上worker.Join();线一点都没有延迟。

我试图在方法末尾插入下一个代码Install()以解决它:

           while (installerProcess.HasExited == false)
            {
                System.Threading.Thread.Sleep(500);
            }

它解决了它,但Thread.Sleep()冻结了我的整个应用程序并提供了糟糕的用户体验。我还找到了一个解决方案,其中包括任务和“忙等待”循环,但我正在寻找更好的解决方案(更有效的解决方案)。

顺便说一句,我正在使用 .NET 4。

有任何想法吗?谢谢

4

2 回答 2

2

如果我是您,我希望将安装程序移至WiX之类的东西。这听起来像是一个使用WiX的复杂安装场景非常适合。

于 2013-05-21T07:02:21.677 回答
1

Process.Start只会开始该过程,不会等待它完成。因此,一旦您开始该过程,您的线程就结束了。假设安装完成后安装程序会退出,可以这样修改代码:

private void Install()
        {
            var item = _installItems.Dequeue();

            item.ProgStage = ProgressStage.Install;
            RefreshPgBars();
            System.Diagnostics.ProcessStartInfo psi = new System.Diagnostics.ProcessStartInfo();
           //insert psi arguments and file name here  

            Process installProc = System.Diagnostics.Process.Start(psi);//start installing
            installProc.WaitForExit();
}

为保证顺序安装,请确保您Dequeue()_installItems一个线程中并仅从该线程运行安装过程..然后Dequeue()再次..循环执行。

于 2013-05-21T13:15:27.757 回答