Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在不同线程中运行静默安装-搜索解决方案而无需等待_C#_Multithreading - Fatal编程技术网

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

C# 在不同线程中运行静默安装-搜索解决方案而无需等待,c#,multithreading,C#,Multithreading,我正在构建安装程序项目,它需要从internet下载许多安装文件(并行执行下载操作),然后开始逐个安装文件。 安装顺序并不重要。当一个文件下载完成后,它被插入到队列中,我让其他工作人员从这个队列中获取文件并逐个安装。 我几乎实现了所有功能,但在安装过程中遇到了问题 我正在使用下一种方法以静默模式安装下载的文件: private void Install() { var item = _installItems.Dequeue();

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

顺便说一句,我正在使用.NET4

有什么想法吗?
谢谢

如果我是你,我希望将安装程序移动到类似的位置。这听起来像是一个非常适合的复杂安装场景。

如果我是你,我希望将安装程序移动到类似的位置。这听起来像是一个非常适合的复杂安装场景。

过程。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()
。。循环执行。

流程。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()
。。循环执行。

如果您不想阻止/冻结,那么不要调用
worker.Join
。就这么简单。对于进一步的解决方案,我们需要知道您为什么要调用
worker.Join
.Damien,如果我不使用worker.Join(),我可能会得到并发安装。你是对的,加入并冻结我的应用程序。我怎样才能避免呢?如果你不想阻止/冻结,那就不要调用
worker.Join
。就这么简单。对于进一步的解决方案,我们需要知道您为什么要调用
worker.Join
.Damien,如果我不使用worker.Join(),我可能会得到并发安装。你是对的,加入并冻结我的应用程序。我怎样才能避免它呢?谢谢你的提醒(我可能会在我的下一个项目中使用它)。据我所知,微软自己的大多数安装程序(包括SQLServer系列产品)都使用WiX。我自己编写了许多使用它的安装程序,这是强烈推荐的。同样值得考虑的是,现在用WiX重新编写这个安装程序可能会更快,这取决于解决这个问题需要多长时间。有很多工具可以处理WiX中的许多场景。我的项目已经实现了90%,所以从这里我只有一个方向要走:-)感谢您的通知(我可能会在我的下一个项目中使用它)。据我所知,微软自己使用WiX来安装他们自己的大多数安装程序,包括SQLServer系列产品。我自己编写了许多使用它的安装程序,这是强烈推荐的。同样值得考虑的是,现在用WiX重新编写这个安装程序可能会更快,这取决于解决这个问题需要多长时间。在WiX中有很多工具可以处理很多场景。我的项目90%已经实现,所以从这里开始我只有一个方向:-)