4

首先,我使用自己的 Process Wrapper 来保存进程的起始路径。

public class MCProcess()
{
       public Process Process { get; set;}
       public string  StartingPath { get; set;}

       public MCProcess(string start, Process p)
       {
             Process = p;
             StartingPath = start;
       }
}

现在,我一直有一个List<MCProcces>名为 runningProcesses,我用它来跟踪我的程序已启动的每个进程的所有进程和启动路径。

例如:

string path = "C:\\Windows\\System32\\notepad.exe";
Process temp = Process.Start(path);
runningProcesses.Add(new MCProcess(path, temp));

现在,有时,我想关闭我已经运行的进程。我没有查看任务管理器并试图找到我启动的每个进程的 MainModuleName,而是出于某种原因包含了 StartingPath。

如果我想关闭记事本,我只需遍历我的运行进程,找出哪个进程具有记事本的起始路径,然后使用 Process.Kill 终止该进程。

string path = "C:\\Windows\\System32\\notepad.exe";
for (int i = 0; i < runningProcesses.Count; i++)
{
     if (runningProcesses[i].StartingPath == path)
     {
          runningProcesses[i].Process.Kill();
          runningProcesses.RemoveAt(i);
     }
}

此代码在 Windows 7 上运行良好,我完全没有问题。但是,在 Windows XP 上使用它时,我得到一个带有 Process.Kill 的 ArgumentNullException。

Process 类有什么东西不能让它在 Windows XP 上正常工作吗?

4

2 回答 2

2

很惊讶这在 win 7 中是如何工作的。您正在修改一个集合,同时在循环中使用它。您应该维护要删除的进程的索引,然后在循环完成后,删除所有进程

尝试类似的东西

var processesToRemove = runningProcesses.Where (p => String.Equals(p.StartingPath, path);
foreach(var process in processToRemove)
{
  process.Process.Kill();
  runningProcesses.Remove(process);
}
于 2012-11-14T13:24:44.307 回答
0

尝试公开您的属性:

Public Process Process { get; set;}
Public string  StartingPath { get; set;}

然后像这样杀死你的进程:

for (int i = 0; i < runningProcesses.Count; i++)
{
    if (runningProcesses[i].StartingPath == path)
    {
          runningProcesses[i].Process.Kill();
    }
}
于 2012-11-14T12:58:38.377 回答