我有这个循环连续运行,作为检查mstsc.exe
是否正在运行的过程。
for (; ; )
{
System.Diagnostics.Process[] pname = System.Diagnostics.Process.GetProcessesByName("mstsc");
if (pname.Length != 0)
{
}
else
{
System.Diagnostics.Process.Start(@"mstsc.exe");
}
System.Threading.Thread.Sleep(3000);
}
问题是在注销,重启或关机时我得到了这个。
我尝试在Form_Closing或
上结束该过程Microsoft.Win32.SystemEvents.SessionEnded +=
new Microsoft.Win32.SessionEndedEventHandler(SystemEvents_SessionEnded);
我仍然得到这个......
我怎么能强制这个过程正确杀死?
答案 0 :(得分:4)
当进程有子进程时会发生这种情况。你必须杀死整个进程树。
Kill process tree programmatically in C#
上面链接中的代码(由Gravitas提供):
/// <summary>
/// Kill a process, and all of its children.
/// </summary>
/// <param name="pid">Process ID.</param>
private static void KillProcessAndChildren(int pid)
{
ManagementObjectSearcher searcher = new ManagementObjectSearcher("Select * From Win32_Process Where ParentProcessID=" + pid);
ManagementObjectCollection moc = searcher.Get();
foreach (ManagementObject mo in moc)
{
KillProcessAndChildren(Convert.ToInt32(mo["ProcessID"]));
}
try
{
Process proc = Process.GetProcessById(pid);
proc.Kill();
}
catch (ArgumentException)
{
// Process already exited.
}
}
答案 1 :(得分:1)
您可以将Thread.Sleep的循环移动到单独的后台线程。这样,当您的进程退出时,它将被静默杀死。
答案 2 :(得分:1)
Timer
代替循环中的System.Threading.Thread.Sleep
timer.Tick += new EventHandler(timer_Tick);
timer.Interval = (1000) * (2);
timer.Enabled = true;
timer.Start();
void timer_Tick(object sender, EventArgs e)
{
System.Diagnostics.Process[] pname = System.Diagnostics.Process.GetProcessesByName("mstsc");
if (pname.Length != 0)
{
}
else
{
System.Diagnostics.Process.Start(@"mstsc.exe");
}
}
答案 3 :(得分:0)
1)当进程退出而不是使用循环时,您可以拥有System.Diagnostic.Process raise an event:
2)您是否尝试使用Thread.Join而不是Thread.Sleep?这将导致消息继续流动;所以即使在睡眠中,如果你收到一个SystemEvent,它也可以被处理。
3)你有什么样的应用程序?它是控制台应用程序还是Windows窗体/ WPF应用程序?你有什么东西可以在适当的位置发送Windows消息(Dispatcher等)吗?