首先,我使用自己的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包含在原因中.
如果我想关闭记事本,我只需遍历我的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上运行良好的东西?
最佳答案 惊讶于这在win 7中是如何工作的.你在循环中使用它时正在修改一个集合.您应该维护要删除的进程索引,然后一旦完成循环,删除所有进程
尝试类似的东西
var processesToRemove = runningProcesses.Where (p => String.Equals(p.StartingPath, path);
foreach(var process in processToRemove)
{
process.Process.Kill();
runningProcesses.Remove(process);
}