Запуск и просмотр заявки на прекращение?C # - PullRequest
4 голосов
/ 20 июня 2011

Хотите знать, можете ли вы мне помочь?

У меня есть приложение (app1), которое может запустить другое приложение (app2), в то время как app2 выполняется app1 может выполнять некоторые действия над папками / файлами, которые меняются в течение жизненного цикла app2.Я могу сделать это отлично и работает отлично.

Однако мне было интересно, есть ли способ, которым я могу контролировать app2, чтобы видеть, когда оно было завершено, чтобы я мог сказать app1 one, чтобы остановить отслеживание?

У меня нет исходного кода для app2, поэтому я не могу отредактировать его для отправки сигнала в app1.

Спасибо за ваше время.

Matt

Ответы [ 3 ]

2 голосов
/ 20 июня 2011

Если вы используете Process, используйте Process.Exited событие

Учтите, что это событие может произойти, только если свойство EnableRaisingEvents имеет значение true

Редактировать: Если вам нужен вывод ответа app2 @ Ивана, лучше дождаться выхода.

2 голосов
/ 20 июня 2011

Вы можете сделать это так:

var p = Process.Start("app2.exe");
// do start watching here
p.WaitForExit();
// do stop watching here

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

Или, в качестве альтернативы, используйте событие Process.Exited, как предложил Navid.

0 голосов
/ 20 июня 2011

Это то, что я использовал в нескольких проектах без каких-либо проблем (пока).

using System.Diagnostics;
using System;

namespace [whatever]
{
    class Executor {
        public event EventHandler Completed;
        public event DataReceivedEventHandler DataReceived;
        public event DataReceivedEventHandler ErrorReceived;

        public void callExecutable(string executable, string args, string workingDir){
            string commandLine = executable;
            ProcessStartInfo psi = new ProcessStartInfo(commandLine);
            psi.UseShellExecute = false;
            psi.LoadUserProfile = false;
            psi.RedirectStandardOutput = true;
            psi.RedirectStandardError = true;
            psi.WindowStyle = ProcessWindowStyle.Minimized;
            psi.CreateNoWindow = true;
            psi.Arguments = args;
            psi.WorkingDirectory = System.IO.Path.GetDirectoryName(executable);
            psi.WorkingDirectory = workingDir;
            Process p = new Process();
            p.StartInfo = psi;
            try{
                p.EnableRaisingEvents = true;
                p.Start();
                if (DataReceived != null) p.OutputDataReceived += DataReceived;
                if (ErrorReceived != null) p.ErrorDataReceived += ErrorReceived;
                p.BeginOutputReadLine();
                p.BeginErrorReadLine();
                p.Exited += new EventHandler(p_Exited);
            }
            catch (Exception ex){
                //log.Error(ex.Message);
            }
        }

        void p_Exited(object sender, EventArgs e) {
            (sender as Process).Close();
            (sender as Process).Dispose();
            if (Completed != null) {
                Completed(this, e);
            }
        }
    }
}
/*
    //In another class
        private void CallProgram() {
            Executor exec = new Executor();
            exec.Completed += new EventHandler(exec_Completed);
            exec.DataReceived += new System.Diagnostics.DataReceivedEventHandler(exec_DataReceived);
            exec.ErrorReceived += new System.Diagnostics.DataReceivedEventHandler(exec_ErrorReceived);
            exec.callExecutable([Program Name],
                [Arguments],
                [Working Dir]);
        }

        void exec_Completed(object sender, EventArgs e) {
            MessageBox.Show("Finshed");
        }

        void exec_DataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e) {
            if (e.Data != null) {
                AddText(e.Data.ToString());
            }
        }

        void exec_ErrorReceived(object sender, System.Diagnostics.DataReceivedEventArgs e) {
            if (e.Data != null) {
                AddText(e.Data.ToString());
            }
        }

        // this handles the cross-thread updating of a winforms control
        private void AddText(string textToAdd) {
            if (textBox1.InvokeRequired) {
                BeginInvoke((MethodInvoker)delegate() { AddText(textToAdd); });
            }
            else {
                textBox1.AppendText(textToAdd);
                textBox1.AppendText("\r\n");
                textBox1.Refresh();
            }
        }

*/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...