가끔씩, 안전하지 않은 방식으로 스레드를 호출했다는 예외가 발생하기 때문에 C# 응용 프로그램을 멀티 스레드로 만들려고합니다. 나는 프로그램에서 멀티 스레딩을 한 번도 해 본 적이 없으므로이 문제에 대해 무지한 생각이 든다면 나에게 곰곰이 생각해보십시오.Windows Forms 응용 프로그램에서 멀티 스레딩 호출?
내 프로그램의 개요는 성능 모니터링 응용 프로그램을 만들고 싶다는 것입니다. 이것이 수반하는 일은 C#의 프로세스 및 성능 카운터 클래스를 사용하여 응용 프로그램의 프로세서 시간을 시작 및 모니터링하고 해당 번호를 다시 UI로 보내는 것입니다. 그러나 실제로 성능 카운터의 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;
}
이것과 배경 작업자 댓글이 꽤 유용한 것, 좋아; 하지만 그것을 이해, 프로세스 자체가 UI 스레드에서 실행되고 있지만 해당 프로세스에서 데이터를 수집하고 업데이트하려면 별도의 스레드를 만들어야합니까? 일반적으로 별도의 스레드를 만들 위치를 어떻게 알 수 있습니까? – Waffles
타이머는 "꺼짐"일 때 사용 가능한 첫 번째 ThreadPool 스레드에서 요청 된 ElapsedEventHandler 대리자를 실행합니다. 따라서 타이머에 요청한 것은 UI 스레드가 아닌 별도의 스레드에서 발생합니다. 배경 작업자를 추가하면 방정식에 또 다른 스레드가 추가됩니다. –