GUI Winform и окончание / процесс убийства - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть приложение ac # GUI, и оно запускает кучу процессов командной строки один за другим.Как мне завершить / убить приложение во время работы процесса командной строки?У меня есть кнопка «Выход» (кнопка 3), но она не работает, если вызываемый процесс все еще выполняется.

private void Run_Process(string process_to_run, string p_arg)
    {
        Process myProcess = new Process();
        richTextBox1.AppendText("\nRunning " + process_to_run);

        try
        {
            myProcess.StartInfo.UseShellExecute = false;
            myProcess.StartInfo.FileName = process_to_run;
            myProcess.StartInfo.Arguments = p_arg;
            myProcess.StartInfo.CreateNoWindow = true;
            myProcess.Start();
            myProcess.WaitForExit();
            richTextBox1.AppendText("...Success");
            time_date = get_time();
            log_file.Write(time_date);
            log_file.WriteLine(process_to_run + "...Success");

        }

        catch (Exception ep)
        {
            richTextBox1.AppendText("\n" + ep.Message);
            time_date = get_time();
            log_file.Write(time_date);
            log_file.WriteLine(process_to_run + "...Failed. ERROR: " + ep.Message);
        }
    }     

  private void button3_Click(object sender, EventArgs e)
    {
        db.connection.Close();
        Application.Exit();
    }

Ответы [ 4 ]

1 голос
/ 08 февраля 2012

Прямо сейчас вы ожидаете завершения процесса:

myProcess.WaitForExit();

Если это происходит в потоке пользовательского интерфейса, вы не сможете выйти (чисто), пока метод не завершится, что означает, что вам нужно дождаться завершения процесса.

Если вместо этого вы не дождетесь завершения процесса, вы сможете выйти немедленно.

Вы должны бытьвозможность переработать логику, чтобы не блокировать, установив Process.EnableRaisingEvents и затем подписавшись на событие Exited в процессе.В этом случае вы можете добавить свой текст к вашему RichTextBox, вместо того, чтобы блокировать основной поток.

0 голосов
/ 14 мая 2014

Environment.Exit (1); действительно работает.

0 голосов
/ 09 февраля 2012

Если вам нужно выйти и выйти сейчас, попробуйте Environment.Exit .

Environment.Exit Method

Завершает этот процесс и дает базовой операционной системе указанный код выхода.

0 голосов
/ 08 февраля 2012

У вас есть звонок на myProcess.WaitForExit(); в Run_Process. Если Run_Process вызывается из основного потока, вы будете блокировать этот поток, пока инструмент командной строки не завершит работу. Это означает, что button3_Click() не может стрелять до тех пор, пока не завершится myProcess.

...