强行杀死进程

时间:2013-04-30 17:06:40

标签: c#

我有这个循环连续运行,作为检查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);
}

问题是在注销,重启或关机时我得到了这个。

enter image description here

我尝试在Form_Closing或

上结束该过程
Microsoft.Win32.SystemEvents.SessionEnded += 
  new Microsoft.Win32.SessionEndedEventHandler(SystemEvents_SessionEnded);

我仍然得到这个......

我怎么能强制这个过程正确杀死?

4 个答案:

答案 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等)吗?