我正在编写将启动许多子进程的 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'
我使用 .NET Reflector 发现 GetProcessById 返回一个“新进程(...)”,但它似乎应该只找到对已运行进程的引用并返回它。
您可以假设第一个 Debug 语句本质上是一个调用,例如
MyCustomDataType 数据 = myDictionary[notepad];
我希望得到我最初插入的数据,而不是得到一个 KeyNotFoundException 可能是因为默认比较器正在进行参考检查。为了解决这个问题,我在字典中添加了一个自定义 IComparer,它只检查两个 Process 对象是否具有相同的 ID,因此我可以按预期获取相关数据。但是,这有其自身的问题,即未运行的进程没有进程 ID,因此有时在我的自定义 IComparer 中对 Process.ID 的调用会引发 InvalidOperationException!!!所以,我已经解决了一个问题,只是为了创建另一个问题。
所以,我想我有两个问题:
- 为什么 .NET 不只返回对已经运行的 Process 实例的引用?
- 我可以做些什么来匹配存储在我的字典中的进程,因为使用进程 ID 在 Process 对象的生命周期内并不总是有效?