Подождите, пока пользователь не закроет другое приложение, открытое WPF в WPF C#

#c# #.net #wpf

#c# #.net #wpf

Вопрос:

У меня есть метод, который хорошо работает при запуске в консольном приложении, но при запуске этого в WPF при нажатии кнопки он открывает приложение, но не ждет, пока приложение закроется.

 private static int OpenApplication(string applicationName)  {  try  {  ProcessStartInfo psi = new ProcessStartInfo  {  FileName = applicationName,  WindowStyle = ProcessWindowStyle.Hidden,  UseShellExecute = true,  };  Process p = Process.Start(psi);  if (p != null)  {    p.WaitForExit();  if (p.ExitCode == 0)  {  return 0;  }  }  }  catch (Win32Exception ex)  {  MessageBox.Show(ex.Message);  }  return 1;  }  

Что я должен сделать, чтобы выполнить функцию, когда пользователь закрывает приложение в WPF? это не ждет, как я пытаюсь в событии нажатия кнопки

 private void Button_Click(object sender, RoutedEventArgs e)  {  var x = OpenApplication("appicationFileName");  if (x == 0)  {  msg.Content = "Exited";  }  else  {  msg.Content = "Waiting";  }   }  

Это хорошо работало в консольном приложении.

Комментарии:

1. пробовал с UseShellExecute = false ?

2. Указанный исполняемый файл не является допустимым приложением для данной платформы ОС, появится ошибка, и он не будет работать. Спасибо за этот комментарий

3. Показывает ли он ошибку через MessageBox. Показать() вообще? Вы пробовали установить точку останова на p.WaitForExit(); и пройти через код?

4. Кроме того, на вашем клике по кнопке у вас есть «асинхронный», но у вас нет вызова «ожидание». Может быть, тебе нужно это сделать var x = await OpenUsersAndGroup("appicationFileName"); . Не уверен, что вы хотели изменить имя, но метод OpenUsersAndGroup (который не отображается, если он отличается) должен иметь такую подпись, как private static Tasklt;intgt; OpenUsersAndGroup(string applicationName)

5. То, что я пробовал, но не работал в качестве основного потока, предполагает, что процесс завершен, а не является частью основного потока.