Это вопрос из двух частей.У меня есть класс, который получает все процессы асинхронно и опрашивает их для использования процессора.Вчера у меня была ошибка с ней, и она была решена здесь .Первая часть вопроса - почему помогло решение.Я не понял объяснения.Вторая часть вопроса заключается в том, что иногда я получаю исключение "Object reference not set to an instance of object"
, когда пытаюсь распечатать результат в конце процесса.Это потому, что item.Key
действительно ноль.Я не понимаю, почему это так, потому что я поставил проверку точки останова для (process == null)
, и она никогда не была достигнута.Что я делаю неправильно?Код ниже.
class ProcessCpuUsageGetter
{
private IDictionary<Process, int> _usage;
public IDictionary<Process, int> Usage { get { return _usage; } }
public ProcessCpuUsageGetter()
{
while (true)
{
Process[] processes = Process.GetProcesses();
int processCount = processes.Count();
Task[] tasks = new Task[processCount];
_usage = new Dictionary<Process, int>();
for (int i = 0; i < processCount; i++)
{
var localI = i;
var localProcess = processes[localI];
tasks[localI] = Task.Factory.StartNew(() => DoWork(localProcess));
}
Task.WaitAll(tasks);
foreach (var item in Usage)
{
Console.WriteLine("{0} - {1}%", item.Key.ProcessName, item.Value);
}
}
}
private void DoWork(object o)
{
Process process = (Process)o;
PerformanceCounter pc = new PerformanceCounter("Process", "% Processor Time", process.ProcessName, true);
pc.NextValue();
Thread.Sleep(1000);
int cpuPercent = (int)pc.NextValue() / Environment.ProcessorCount;
if (process == null)
{
var x = 5;
}
if (_usage == null)
{
var t = 6;
}
_usage.Add(process, cpuPercent);
}
}