C#结束任务不结束进程

时间:2012-02-21 08:05:55

标签: c# .net visual-studio

这里的另一个问题。  我只是想知道是否可以使用C#结束任务那些应用程序。

喜欢:有4个记事本应用程序打开。我只想关闭第二个记事本应用程序。但是当我试图使用process.Kill时,所有4个记事本都被关闭了。有没有办法只关闭指定的Noteped?

以下是我的示例代码:

foreach (Process p in Process.GetProcesses("."))
{
    if (p.MainWindowTitle.Length > 0)
    {
        if (p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt")
        {
            p.Kill();
        }
    }
}

4 个答案:

答案 0 :(得分:3)

您需要使用进程开始时间来查找第二次运行记事本。

Process[] processes = (from prc in Process.GetProcessesByName("notepad")
                       orderby prc.StartTime
                       select prc).ToArray();

if (processes.Count() > 1)
    processes[1].Kill();

答案 1 :(得分:0)

您遍历foreach (Process p in Process.GetProcesses("."))循环中的所有流程,并以"NotepadName.txt"开头的标题终止任何流程。

如果你只想杀死第二个实例,你必须修改循环中的逻辑以使其更具选择性。

int i = 0;
foreach (Process p in Process.GetProcesses("."))
{
    if (p.MainWindowTitle.Length > 0)
    {
        if (p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt")
        {
            i++;
            if(i == 2){
                p.Kill();
                break;
            }
        }
    }
}

答案 2 :(得分:0)

首先,我认为您的意思是您只想关闭正在查看NotepadName.txt文件的记事本进程。您可能正在尝试拒绝访问该文件(或关闭无论出于何种原因访问该文件的人)。因此,我忽略了“第二”部分。

我运行了您的代码并对其进行了测试,并且只能关闭访问我定位的文件的记事本进程。

然而,我注意到你的比较绝对不正确。

//not all processes have a string of 31 characters 
//so sometimes it will trigger an exception
if (p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt") 
    {
        p.Kill();
    }

出于您的目的,请替换为

if (p.MainWindowTitle.Contains("NotepadName.txt"))
    {
        p.Kill();
    }

从我运行的测试中,这应该可行。

答案 3 :(得分:0)

有很多关于PID的问题,所以我必须为每个人都回答的问题写一个更清晰的答案(虽然这可能不是原始问题)。

因此,为了杀死第二个(按流程开始时间的顺序)流程完全填写示例中的条件,您应该写

var processToKill = (from p in Process.GetProcesses(".") where p.MainWindowTitle.Length > 0 and p.MainWindowTitle.Substring(0, 31) == "NotepadName.txt" order by p.StartTime).Skip(1).FirstOrDefault();
if(processToKill != null)
{
    processToKill.Kill();
}