Я пытаюсь сделать свое приложение C # многопоточным, потому что иногда я получаю исключение, которое говорит, что я сделал вызов потоку небезопасным способом. Я никогда раньше не занимался многопоточностью в программе, так что терпите меня, если я немного неосведомлен в этом вопросе.
Обзор моей программы заключается в том, что я хочу создать приложение для мониторинга производительности. Это влечет за собой использование класса C и счетчика производительности в C # для запуска и мониторинга времени процессора приложения и отправки этого числа обратно в пользовательский интерфейс. Однако в методе, который фактически вызывает метод nextValue счетчика производительности (который устанавливается для выполнения каждую секунду благодаря таймеру), я иногда получал вышеупомянутое исключение, которое говорило бы о небезопасном вызове потока.
Я приложил часть кода для вашего прочтения. Я знаю, что это довольно трудоемкий вопрос, поэтому я был бы очень признателен, если бы кто-нибудь мог предложить мне какую-либо помощь относительно того, где создать новую тему и как ее безопасно вызвать. Я попытался посмотреть, что происходит на MSDN, но это просто смутило меня.
private void runBtn_Click(object sender, EventArgs e)
{
// this is called when the user tells the program to launch the desired program and
// monitor it's CPU usage.
// sets up the process and performance counter
m.runAndMonitorApplication();
// Create a new timer that runs every second, and gets CPU readings.
crntTimer = new System.Timers.Timer();
crntTimer.Interval = 1000;
crntTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
crntTimer.Enabled = true;
}
private void OnTimedEvent(object source, ElapsedEventArgs e)
{
// get the current processor time reading
float cpuReading = m.getCPUValue();
// update the current cpu label
crntreadingslbl.Text = cpuReading.ToString(); //
}
// runs the application
public void runAndMonitorApplication()
{
p = new Process();
p.StartInfo.UseShellExecute = true;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = fileName;
p.Start();
pc = new System.Diagnostics.PerformanceCounter("Process",
"% Processor Time",
p.ProcessName,
true);
}
// This returns the current percentage of CPU utilization for the process
public float getCPUValue()
{
float usage = pc.NextValue();
return usage;
}