在不同的线程中运行静默安装 - 搜索解决方案而无需繁忙等待

时间:2013-05-21 06:54:54

标签: c# multithreading

我正在构建安装程序项目,需要从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()冻结了我的整个应用程序并提供了糟糕的用户体验。 我还找到了一个包含Task和“忙碌等待”循环的解决方案,但我正在寻找更好的解决方案(更高效的解决方案)。

BTW我正在使用.NET 4。

任何想法? 感谢

2 个答案:

答案 0 :(得分:2)

如果我是你,我会将安装程序移到WiX之类的地方。这听起来像一个复杂的安装场景,WiX非常适合。

答案 1 :(得分: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() ...在循环中执行