这段代码可以正常工作:
Process v = Process.GetProcessById(6752); // firefox
Console.WriteLine(v);
ProcessThreadCollection th = v.Threads;
foreach (ProcessThread pt in th)
{
var info = string.Format("-> Thread ID: {0}\tStart Time: {1}\tPriority: {2}",
pt.Id, pt.StartTime.ToShortTimeString(), pt.PriorityLevel);
Console.WriteLine(info);
}
但不要使用此方法:
Process v = Process.GetProcessById(6752); // firefox
Console.WriteLine(v);
ProcessThreadCollection th = v.Threads;
foreach (var pt in th) // var instead of ProcessThread
{
var info = string.Format("-> Thread ID: {0}\tStart Time: {1}\tPriority: {2}",
pt.Id, pt.StartTime.ToShortTimeString(), pt.PriorityLevel);
Console.WriteLine(info);
}
pt
在第二秒被编译器假定为object
,当然不会编译。为什么编译器将
ProcessThreadCollection
的元素假定为object
而不是ProcessThread
? 最佳答案
ProcessThreadCollection
的枚举器来自其枚举器为ReadOnlyCollectionBase
而不是IEnumerator
的IEnumerator<ProcessThread>
。GetEnumerator
中的ReadOnlyBaseCollection
是虚拟方法,默认情况下返回this.InnerList.GetEnumerator()
-InnerList是ArrayList
。 ProcessThreadCollection
不会覆盖此方法,这就是为什么要获取对象而不是ProcessThread
的原因。
最好的解决方案是(正如我确定您知道的那样)简单地执行此操作:
foreach(ProcessThread pt in th)