我有一个创建同一程序的多个控制台应用程序在Windows窗体中的控制台应用程序(它调用的Program.exe任意次数)使用干净地杀死一组控制台应用程序
process.start().
我寻找一种方法来识别应用程序的特定运行并干净地杀死它(即干净地关闭program.exe的第5个进程,但保留所有其他进程运行)。我能够通过当过程被启动给予该ID来标识的Program.exe的每个不同的过程,但我无法关闭应用程序的任何其他方式比调用
process.kill()
不执行干净关闭的应用程序。
我相信,我不能使用
因为应用程序没有一个窗口(它是通过在后台运行的控制台运行)。我选择从正在运行的进程列表中选择要终止的进程后,通过单击GUI中的按钮来终止进程。
我需要这个的原因是因为我需要在关闭之前关闭每个进程的所有线程和突出方面。
我定义每个新过程如下,
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。
在一个单独的类中,我通过只通过启动程序的命令提示符(即调用程序,提供配置变量等)引用的进程执行代码。
有没有什么办法可以干净地关闭进程?我在想,当我想要杀死进程的时候会有一个事件被调用,但是到目前为止,我还没有能够实现这个想法,因为我无法指定我想关闭哪个进程。
**编辑 - 我的代码事件处理,我试图impliment但它不工作。
代码在主窗口
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");
}
}
我为您推荐的EventWaitHandle Idea提供了很好的帮助。谢谢 – jwb555
Downvoter?习惯于提供评论,给出downvote的理由。 –