运行静默安装在不同的线程-搜索解决方案,没有忙碌的等待



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

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

        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。

任何想法?由于

如果我是你,我会考虑将安装程序移动到WiX之类的东西上。这听起来像是一个非常适合使用WiX的复杂安装场景。

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();
}

为了保证顺序安装,确保在一个线程中从_installItems运行Dequeue(),并且只从该线程运行安装过程。然后又是Dequeue() ..

相关内容

最新更新