У меня есть форма Windows, которая создает несколько консольных приложений одной и той же программы (она вызывает program.exe любое количество раз), используя
process.start().
Я ищу способ определить конкретный запускприложение и убейте его полностью (т.е. аккуратно закройте 5-й процесс program.exe, но оставьте все остальные процессы запущенными).Я могу идентифицировать каждый отдельный процесс program.exe с помощью идентификаторов, которые были даны при запуске процессов, но я не могу закрыть приложение, кроме как вызвать
process.kill()
, который не выполняетуберите закрытие приложения.
Я считаю, что я не могу использовать
process.CloseMainWindow()
, поскольку у приложения нет окна (оно запускается через консоль, которая работает в фоновом режиме).Я пытаюсь завершить процессы, нажав кнопку в моем графическом интерфейсе после выбора процесса, который нужно уничтожить, из списка запущенных процессов.
Причина, по которой мне это нужно, заключается в том, что мне нужно закрытьвсе потоки и нерешенные аспекты каждого процесса до его закрытия.
Я определяю каждый новый процесс следующим образом:
Process process = new Process();
process.StartInfo = info;
ExecutionDetails details = new ExecutionDetails(run_id, process, info, session_type, strategy_type, name, ExecutionViewModel);
lock (_runs)
_runs.Add(run_id, details); // will throw on Add if duplicate id, prevent duplicate
ExecutionViewModel.NewRun(details); // add to the view model
process.Start();
Где run_id - это GUID, который идентифицирует каждый процесс.
В отдельном классе у меня есть код, который выполняется через процесс, на который ссылается только через командную строку, которая запускает программу (то есть вызывает программу, предоставляет переменные конфигурации и т. Д.).
Можно ли как-нибудь аккуратно закрыть процессы?Я думал, что событие, которое вызывается, когда я хочу завершить процесс, может работать, но до сих пор я не смог реализовать эту идею, так как не могу указать, какой процесс я хочу закрыть.
** РЕДАКТИРОВАТЬ - мой код для обработки событий, который я пытался реализовать, но он не работает.
Код в главном окне
public void KillOne() {
foreach (var details in _runs.Values) {
if(details.IsSelected) {
StrategyStateManager.SessionClosed(this, details.RunId);
} } }
Код в StrategyStateManager (средний класс, используемый для хранения переменных и событий, используемых в программе)
public delegate void StrategyCloseEventHandler(object sender, StrategyCloseEventArgs e);
public static void SessionClosed(object sender, Guid id)
{
if(CloseSession != null)
CloseSession(sender, new StrategyCloseEventArgs(id));
}
public class StrategyCloseEventArgs : EventArgs
{
private readonly Guid id;
public StrategyCloseEventArgs(Guid run_id)
{
id = run_id;
}
public Guid GetRunID()
{
return id;
}
}
Код в процессе, которыйзапускается главным окном
StrategyStateManager.CloseSession += (closeStrategy);
void closeStrategy(object sender, StrategyCloseEventArgs e)
{
if (e.GetRunID() == run_id)
{
strategy.cleanupForShutdown();
DBSaverSimple.shutdownAll();
logger.Warn("Simulation run stopped by user");
}
}