c# выполнение командного файла все еще выполняется после закрытия моего приложения? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть этот код

    public static void ExecuteCommand(string command, string workingFolder, int TimeoutMin)
    {
        int ExitCode;
        ProcessStartInfo ProcessInfo;
        Process process;

        ProcessInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
        ProcessInfo.CreateNoWindow = true;
        ProcessInfo.UseShellExecute = false;
        ProcessInfo.WorkingDirectory = workingFolder;
        // *** Redirect the output ***
        ProcessInfo.RedirectStandardError = true;
        ProcessInfo.RedirectStandardOutput = true;

        process = Process.Start(ProcessInfo);
        process.WaitForExit(TimeoutMin * 1000 * 60);

        // *** Read the streams ***
        string output = process.StandardOutput.ReadToEnd();
        string error = process.StandardError.ReadToEnd();

        ExitCode = process.ExitCode;

        MessageBox.Show("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output));
        MessageBox.Show("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error));
        MessageBox.Show("ExitCode: " + ExitCode.ToString(), "ExecuteCommand");
        process.Close();
    }

Он запускает командный файл в C#

, это командный файл, запускающий длительный процесс, который занимает несколько минут

, когда я вызовите ExecuteCommand, затем закройте приложение, командный файл все еще работает, даже если приложение закрыто

Есть ли способ контролировать запуск командных файлов из моего c# кода?

1 Ответ

0 голосов
/ 26 мая 2020

Согласно C# зависание процесса из-за StandardOutput.ReadToEnd () и StandardError.ReadToEnd () и Зависание процесса при запуске с. NET Process.Start - что не так?

Если вывод заполнен информацией, ваш поток может быть заблокирован.

Следующие строки блокируют вашу операцию

    process.WaitForExit(TimeoutMin * 1000 * 60);
    string output = process.StandardOutput.ReadToEnd();
    string error = process.StandardError.ReadToEnd();

То есть process.Close никогда не вызывается до завершения пакетной обработки.

Если требуется прерывание беременности, вам нужно закрыть process где-нибудь еще, пока приложение закрывается.

Я воспроизвожу вашу проблему с помощью

  1. Вставка фрагмента кода в событие нажатия кнопки в небольшом приложении winform.
  2. Нажмите кнопку.
  3. UI завис <--- Это означает, что фрагмент кода блокирует (UI) резьба. </li>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...