ProcessStartInfo hanging on “WaitForExit”? Why?

前端 未结 22 1864
佛祖请我去吃肉
佛祖请我去吃肉 2020-11-22 02:59

I have the following code:

info = new System.Diagnostics.ProcessStartInfo(\"TheProgram.exe\", String.Join(\" \", args));
info.CreateNoWindow = true;
info.Win         


        
22条回答
  •  醉话见心
    2020-11-22 03:24

    I've read many of the answers and made my own. Not sure this one will fix in any case, but it fixes in my environment. I'm just not using WaitForExit and use WaitHandle.WaitAll on both output & error end signals. I will be glad, if someone will see possible problems with that. Or if it will help someone. For me it's better because not uses timeouts.

    private static int DoProcess(string workingDir, string fileName, string arguments)
    {
        int exitCode;
        using (var process = new Process
        {
            StartInfo =
            {
                WorkingDirectory = workingDir,
                WindowStyle = ProcessWindowStyle.Hidden,
                CreateNoWindow = true,
                UseShellExecute = false,
                FileName = fileName,
                Arguments = arguments,
                RedirectStandardError = true,
                RedirectStandardOutput = true
            },
            EnableRaisingEvents = true
        })
        {
            using (var outputWaitHandle = new AutoResetEvent(false))
            using (var errorWaitHandle = new AutoResetEvent(false))
            {
                process.OutputDataReceived += (sender, args) =>
                {
                    // ReSharper disable once AccessToDisposedClosure
                    if (args.Data != null) Debug.Log(args.Data);
                    else outputWaitHandle.Set();
                };
                process.ErrorDataReceived += (sender, args) =>
                {
                    // ReSharper disable once AccessToDisposedClosure
                    if (args.Data != null) Debug.LogError(args.Data);
                    else errorWaitHandle.Set();
                };
    
                process.Start();
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();
    
                WaitHandle.WaitAll(new WaitHandle[] { outputWaitHandle, errorWaitHandle });
    
                exitCode = process.ExitCode;
            }
        }
        return exitCode;
    }
    

提交回复
热议问题