Как узнать, успешно ли Process.Start ()? - PullRequest
24 голосов
/ 22 апреля 2011

Я пробовал два разных метода для запуска процесса.

Первый

Определение определяется как параметры метода Start:

System.Diagnostics.Process.Start("excel", string.Format("\"{0}\"", ExcelFileBox.Text.ToString()));

Мои мысли:

Этот начинается просто отлично, но я не знаю, как получить от него обратную связь.

Второй

Я начал изучать ProcessStartInfo, потому что я хочу знать, успешно ли запущен Excel или нет - например, хотя вполне вероятно, что он существует нана компьютере пользователя, нет никакой гарантии, и было бы глупо для меня указать пользователю, что он успешно запущен, когда он еще не сделал.

System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo
            {
                FileName = "excel",
                Arguments = string.Format("\"{0}\"", ExcelFileBox.Text.ToString()),
                ErrorDialog = true,
                UseShellExecute = false,
                WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
            };

            try
            {
                System.Diagnostics.Process.Start(startinfo);
            }
            catch (Exception err)
            {
                Console.WriteLine(err.Message);
            }

Мои мысли:

Это даетошибка: «Система не может найти указанный файл», но неясно, означает ли это приложение Excel или мой файл.В любом случае, хотя я ценю возможность сообщения об ошибке, я не должен получать в данный момент.

Мысли, предложения, идеи о том, как узнать, успешно ли это произошло?

Решено

Я включил первый способ запуска процесса в try-catch, и он прекрасно работает.

Ответы [ 4 ]

18 голосов
/ 22 апреля 2011

На странице MSDN Process.Start () указано, что этот метод имеет перегрузку типа Boolean, где возвращаемые значения означают:

true, если ресурс процесса запущен; false, если нет нового ресурса процесса началось (например, если существующий процесс используется повторно).

Дополнительно он может выдавать три исключения:

  • InvalidOperationException

В StartInfo компонента Process не было указано имя файла.

-или-

Элемент ProcessStartInfo.UseShellExecute свойства StartInfo имеет значение true, тогда как ProcessStartInfo.RedirectStandardInput, ProcessStartInfo.RedirectStandardOutput или ProcessStartInfo.RedirectStandardError имеет значение true.

  • Win32Exception

Произошла ошибка при открытии соответствующего файла.

  • ObjectDisposedException

Объект процесса уже удален.


Чтобы использовать эту перегрузку Process.Start () (которая является единственной нестатической перегрузкой метода), вам необходимо создать экземпляр класса Process, используя объект ProcessStartInfo.

Пример этого ниже:

ProcessStartInfo processStartInfo = new ProcessStartInfo("EXCEL.EXE");

Process process = new Process();
process.StartInfo = processStartInfo;
if (!process.Start())
{
    // That didn't work
}

Хотя, учитывая, что это все равно может привести к ошибкам, вам, вероятно, лучше просто заключить перехват в один из статических вызовов метода .Start ().


Учитывая это, кажется очевидным, что вызов Process.Start () будет либо работать, либо нет, и вы можете определить это по возвращаемому значению 0 (или выбрасываемому исключению).

После того, как ваш процесс запущен, у вас появляется большой контроль над вещами, а свойства класса Process, такие как HasExited, позволяют вам проверить, в каком состоянии находится процесс.

Короче говоря - если у пользователя нет Excel на своем компьютере, Process.Start () сгенерирует исключение.

5 голосов
/ 22 апреля 2011

Можно проверить свойство Process.ExitCode для значения 0 ( success ).

4 голосов
/ 22 апреля 2011

Process.Start () также возвращает логическое значение, которое позволяет узнать, получил ли он существующий процесс или был запущен новый процесс.

Кроме того, вы можете проверить ProcessId процесса, чтобы убедиться, что он запущен / все еще работает. Что-то вроде:

bool started = False;
Process p = new Process();
p.StartInfo = YourStartInfo;
started = p.Start();

try {
  int procId = p.Id;
}
catch(InvalidOperationException){
  started = False
}
catch(Exception ex) {
  started = False
}
0 голосов
/ 23 июня 2019

Чтобы точно определить, действительно ли процесс запущен, я попытался найти идентификатор процесса, если он найдет идентификатор процесса, он продолжит работу, если не сможет найти идентификатор процесса, он введет catch и напечатает оператор отладки.1001 *

            try
            {
                 bool pathExists = File.Exists(module.ExecutionPath);
                 if (pathExists)
                 {
                     ProcessStartInfo startArgs = new ProcessStartInfo();
                     startArgs.FileName = "C:\Windows\System32\notepad.exe";
                     startArgs.Arguments = null;

                     Process process = new Process();
                     process.StartInfo = startArgs;
                     process.Start();

                    Process startedProcess = CheckIfProcessStarted(process);
                 }
            }
            catch (Exception ex)
            {
                Debug.WriteLine(ex.Message + "  " + ex.InnerException);
                Debug.WriteLine("Couldnt find the process so it never ran");
            }

            private Process CheckIfProcessStarted(Process process)
            {
                return Process.GetProcessById(process.Id);
            }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...