Я пытаюсь сделать мое приложение C# многопоточным, потому что иногда я получаю исключение, которое говорит, что я сделал вызов потока небезопасным образом. Я никогда не делал многопоточности раньше в программе, так что несите меня, если я буду казаться немного невежественным в этой проблеме.Многопоточные вызовы в приложении Windows Forms?
Обзор моей программы заключается в том, что я хочу сделать приложение для мониторинга производительности. Это подразумевает использование класса производительности и производительности в 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;
}
Хорошо, это и фон рабочий комментарий, кажется, очень полезно; но, как я понимаю, сам процесс работает в потоке пользовательского интерфейса, но я должен создать отдельный поток для сбора и обновления данных по этому процессу? В общем, как я смогу сказать, где сделать отдельный поток? – Waffles
Таймер выполнит запрос делегата ElapsedEventHandler в первом доступном потоке ThreadPool, когда таймер «отключится». Поэтому все, что вы просили таймер, будет происходить в отдельном потоке, а не в потоке пользовательского интерфейса. Добавление фонового работника будет просто ввести еще один поток в уравнение. –