【问题标题】:Process.WaitForExit hangs while another installation is runProcess.WaitForExit 在运行另一个安装时挂起
【发布时间】:2011-11-16 10:49:53
【问题描述】:

美好的一天! 我正在开发安装程序,它使用 Process.Start 为我的软件安装额外的依赖项。

foreach dependency:
var process = System.Diagnostics.Process.Start(processStartInfo);
process.WaitForExit();

问题是当另一个 msi 安装运行时,WaitForExit 挂起(当我关闭另一个 msi 安装时,WaitForExit 也退出)。

我不能使用超时,因为安装时间不同,依赖项也不同。

有什么方法可以处理这种情况并正确终止进程(实际上我想知道依赖项是安装还是挂起)? 非常感谢。

解决方案:在我的情况下,通过检查“msiexec”进程是否正在运行来解决问题。

【问题讨论】:

  • 您有什么理由不使用 VS 的安装程序项目并在其中包含所有相关依赖项?或者只是将它们嵌入到你的 EXE/DLL 中(假设它们是 .NET,你甚至可以从内存中运行它们)?
  • 并不是所有的都是.NET,依赖可以从网上下载。安装程序非常庞大且复杂。反正关于挂WaitForExit的问题。
  • 仍然 - 来自 VS 的安装程序项目可以安装依赖项...无需自己编写...
  • 我不需要重写安装程序的架构,只需要修复错误;)
  • 为什么你认为它是“挂起”而不是等待进程退出?听起来它正在做你要求它做的事情,即WaitForExit

标签: c# .net-4.0 waitforexit


【解决方案1】:

我的问题的解决方案 - 检查由 msiexec 创建的全局互斥锁。这也是检查另一个 msi 安装是否正在运行的正确方法。

    public static bool WaitAnotherMsiInstallation(int timeout)
    {
        const string MsiMutexName = "Global\\_MSIExecute";

        try
        {
            using (var msiMutex = Mutex.OpenExisting(MsiMutexName, MutexRights.Synchronize))
            {
                return msiMutex.WaitOne(timeout);
            }
        } 
        catch (WaitHandleCannotBeOpenedException)
        {
            // The named mutex does not exist.
            return true;
        }
        catch (ObjectDisposedException)
        {
            // Mutex was disposed between opening it and attempting to wait on it
            return true;
        }
    }

这里有一些细节http://msdn.microsoft.com/en-us/library/aa372909(VS.85).aspx

【讨论】:

    猜你喜欢
    • 2010-11-06
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    • 1970-01-01
    • 2019-03-19
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多