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 を含めました。

メモ帳を閉じたい場合は、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 でうまく動作しない理由はありますか?

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 に答える