Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Windows XP的.NET进程问题_C#_.net_Process_Windows Xp - Fatal编程技术网

C# Windows XP的.NET进程问题

C# Windows XP的.NET进程问题,c#,.net,process,windows-xp,C#,.net,Process,Windows Xp,首先,我使用自己的流程包装器来保存流程的起始路径 public class MCProcess() { public Process Process { get; set;} public string StartingPath { get; set;} public MCProcess(string start, Process p) { Process = p; StartingP

首先,我使用自己的流程包装器来保存流程的起始路径

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

       public MCProcess(string start, Process p)
       {
             Process = p;
             StartingPath = start;
       }
}
现在,我保留了一个名为runningprocesss的
列表
,用于跟踪我的程序启动的每个进程的所有进程和启动路径

例如:

string path = "C:\\Windows\\System32\\notepad.exe";
Process temp = Process.Start(path);
runningProcesses.Add(new MCProcess(path, temp));
现在,有时,我想关闭已运行的进程。我没有查看任务管理器并试图找到我启动的每个进程的MainModuleName,而是出于某种原因包含了启动路径

如果我想关闭记事本,我只需循环运行进程,找出哪个进程具有记事本的启动路径,然后使用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);
     }
}
string path=“C:\\Windows\\System32\\notepad.exe”;
for(int i=0;i
这段代码在Windows7上运行得很好,我一点问题都没有。但是,当在Windows XP上使用此选项时,我会遇到Process.Kill异常


Process类是否存在某些不适合在Windows XP上正常工作的地方?

尝试将属性公开:

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();
    }
}
for(int i=0;i
这让win 7的工作方式大为惊讶。在循环中使用集合时,您正在修改集合。您应该维护要删除的进程的索引,然后在完成循环后,删除所有进程

试试像这样的东西

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

您是否验证了
runningprocesss[i]
实际上不是空的,并找到了如何避免运行空引用。@Ramhound是的,runningProcess[i]不是空的。您得到了一个空的expecton,这意味着
runningprocesss[i]
实际上是空的。@Ramhound没有多个线程怎么能
runningprocesss[i]
运行进程[i]时必须为空.StartingPath
不会抛出
ArgumentNullException
?该类没有静态
Kill
方法,这意味着上述代码不可能正确-您可以复制并粘贴实际代码吗?在循环过程中修改集合是100%正确的,只要您没有枚举它。在这种情况下,最糟糕的情况是跳过终止进程之后的项,这很容易用
i--
来修复。我同意你的看法,并在这个问题(不是一般性问题)的背景下发表了评论。NET通过foreach/IEnumerable处理它。但开发人员应该足够小心,不要在其他循环构造中滥用它。这样的错误很难发现和重新编程。(当然,并不是说它到处都是错的,这取决于上下文)