Windows XP的.NET进程问题

时间:2012-11-13 23:38:24

标签: c# .net process windows-xp

首先,我使用自己的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;
       }
}

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

例如:

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

现在,有时,我想关闭我运行的进程。我没有查看任务管理器并尝试查找我开始的每个进程的MainModuleName,而是将StartingPath包含在原因中。

如果我要关闭记事本,我只需遍历我的runningProcesses,找出哪个进程具有记事本的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上运行良好?

2 个答案:

答案 0 :(得分:2)

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

尝试类似

的内容
var processesToRemove = runningProcesses.Where (p => String.Equals(p.StartingPath, path);
foreach(var process in processToRemove)
{
  process.Process.Kill();
  runningProcesses.Remove(process);
}

答案 1 :(得分: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();
    }
}