3

多くの子プロセスを起動する ac# プログラムを書いています。しばらくして、これらのプロセスを ID で取得し、それらのプロセスを、最初に作成されたときに Dictionary に追加された Dictionary に格納されている一連のプロセスと照合する必要があります。しかし、私は純粋にばかげているように見える問題に遭遇しています...

Process notepad = new Process();
notepad.StartInfo.FileName = "notepad";
notepad.Start();

Process n2 = Process.GetProcessById(notepad.Id);

Debug.WriteLine(notepad == n2);       //'False', but Why isn't this true???
Debug.WriteLine(notepad.Id == n2.Id); //'True'

GetProcessById が 'new Process(...)' を返すことを確認するために .NET Reflector を使用しましたが、既に実行中のプロセスへの参照を見つけて代わりに返す必要があるようです。

最初の Debug ステートメントは基本的に次のような呼び出しであると想定できます

MyCustomDataType data = myDictionary[メモ帳];

最初に挿入したデータを取得することを期待しますが、代わりに KeyNotFoundException を取得するのは、おそらくデフォルトの比較子が参照チェックを行っているためです。これに対抗するために、辞書にカスタムの IComparer を追加しました。このカスタム IComparer は、2 つの Process オブジェクトが同じ ID を持っていることを確認するだけなので、期待どおりに関連付けられたデータを取得できます。ただし、これには、実行されていないプロセスにはプロセス ID がないという独自の問題があるため、カスタム IComparer で Process.ID を呼び出すと、InvalidOperationException がスローされることがあります!!! だから、私は別の問題を作成するためだけに 1 つの問題を修正しました。

だから、私は2つの質問があると思います:

  • .NET が既に実行中の Process インスタンスへの参照を返さないのはなぜですか?
  • プロセス ID の使用が Process オブジェクトの存続期間中常に有効であるとは限らないため、ディクショナリに格納されているプロセスを一致させるにはどうすればよいですか?
4

5 に答える 5

0

ProcessId を辞書のキーとして使用します。

必要になるたびに、GetProcessById を使用して Process の新しいインスタンスを作成することを恐れないでください。これは軽量のオブジェクトであり、ガベージ コレクターがクリーンアップします。

于 2009-12-17T07:19:27.167 に答える