ProcessStartInfo, зависающий на “WaitForExit”? Почему?

Как будто вы пытаетесь получить доступ к объекту, который является null. Рассмотрим ниже пример:

TypeA objA;

. В это время вы только что объявили этот объект, но не инициализировали или не инициализировали. И всякий раз, когда вы пытаетесь получить доступ к каким-либо свойствам или методам в нем, он будет генерировать NullPointerException, что имеет смысл.

См. Также этот пример:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
179
задан Kara 14 January 2014 в 17:37
поделиться

3 ответа

У нас есть эта проблема также (или вариант).

Попытка следующее:

1) Добавляют тайм-аут к p. WaitForExit (nnnn); где nnnn находится в миллисекундах.

2) Помещенный вызов ReadToEnd перед вызовом WaitForExit. Это , что мы видели, что MS рекомендует.

7
ответ дан torial 23 November 2019 в 06:15
поделиться

в документации для Process.StandardOutput говорится для чтения перед ожиданием иначе, можно зайти в тупик, отрывок, скопированный ниже:

 // Start the child process.
 Process p = new Process();
 // Redirect the output stream of the child process.
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.FileName = "Write500Lines.exe";
 p.Start();
 // Do not wait for the child process to exit before
 // reading to the end of its redirected stream.
 // p.WaitForExit();
 // Read the output stream first and then wait.
 string output = p.StandardOutput.ReadToEnd();
 p.WaitForExit();
93
ответ дан Rob 23 November 2019 в 06:15
поделиться

Я прочитал многие ответы и сделал мое собственное. Не уверенный этот зафиксирует в любом случае, но это фиксирует в моей среде. Я просто не использую WaitForExit и использование WaitHandle. WaitAll на оба производят & ошибочные сигналы конца. Я буду радоваться, если кто-то будет видеть возможные проблемы с этим. Или если это поможет кому-то. Для меня это лучше, потому что не использует тайм-ауты.

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;
}
0
ответ дан 23 November 2019 в 06:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: