6

我有这个循环作为一个进程连续运行,以检查它是否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);

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

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

4

4 回答 4

6

当进程有子进程时会发生这种情况。你必须杀死整个进程树。

在 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.
    }
}
于 2013-04-30T18:08:43.090 回答
2

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");
        }
    }
于 2013-04-30T18:25:50.103 回答
1

您可以使用 Thread.Sleep 将循环移动到单独的后台线程。这样,当您的进程退出时,它将被静默杀死。

于 2013-04-30T17:13:01.250 回答
0

1)您可以让 System.Diagnostic.Process在进程退出而不是使用循环时引发事件:

2)您是否尝试过使用Thread.Join而不是 Thread.Sleep?这将导致消息不断涌现;因此,即使在睡眠中,如果您收到 SystemEvent,也可以对其进行处理。

3)你有什么样的应用程序?它是控制台应用程序还是 Windows 窗体/WPF 应用程序?您是否有任何东西可以将 Windows 消息发送到位(调度程序等)?

于 2013-04-30T18:00:04.443 回答