我正在构建安装程序项目,需要从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。
任何想法? 感谢
答案 0 :(得分:2)
答案 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()
...在循环中执行