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