Process.WaitForExit在运行另一个安装时挂起

时间:2011-11-16 10:49:54

标签: c# .net-4.0 waitforexit

美好的一天! 我正在使用安装程序,它使用Process.Start为我的软件安装了其他依赖项。

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

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

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

有没有办法处理这种情况并正确杀死进程(实际上我想知道依赖是安装还是只挂)? 非常感谢。

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

1 个答案:

答案 0 :(得分: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