Ich versuche, meine C# -Anwendung Multi-Threading zu machen, weil ich manchmal eine Ausnahme bekomme, die besagt, dass ich einen Thread auf eine unsichere Art und Weise aufgerufen habe. Ich habe noch nie ein Multi-Threading in einem Programm gemacht, also ertragen Sie mit mir, wenn ich mich etwas unwissend in der Sache anhört.Multi-Threading-Aufrufe in Windows Forms-Anwendung?
Die Übersicht meines Programms ist, dass ich eine Performance-Monitoring-Anwendung machen möchte. Dies beinhaltet die Verwendung der Prozess- und Leistungsindikatorklasse in C# zum Starten und Überwachen der Prozessorzeit einer Anwendung und zum Zurücksenden dieser Nummer an die Benutzeroberfläche. In der Methode, die tatsächlich die nextValue-Methode des Leistungszählers aufruft (die aufgrund eines Timers jede Sekunde ausgeführt wird), erhalte ich manchmal die oben erwähnte Ausnahme, die darüber spricht, einen Thread unsicher aufzurufen.
Ich habe einen Teil des Codes für Ihre Kenntnisnahme beigefügt. Ich weiß, dass das eine zeitraubende Frage ist, also wäre ich wirklich dankbar, wenn mir jemand helfen könnte, wo ich einen neuen Thread erstellen könnte und wie man ihn sicher nennt. Ich habe versucht zu sehen, was auf MSDN war, aber das hat mich irgendwie verwirrt.
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;
}
Okay, das der Hintergrund Arbeiter Kommentar ziemlich nützlich erscheinen; Aber wie ich es verstehe, läuft der Prozess selbst im UI-Thread, aber ich muss einen separaten Thread erstellen, um Daten zu diesem Prozess zu sammeln und zu aktualisieren. Wie kann ich im Allgemeinen sagen, wo ein separater Thread erstellt werden soll? – Waffles
Der Zeitgeber wird den angeforderten ElapsedEventHandler-Delegaten für den ersten verfügbaren ThreadPool-Thread ausführen, wenn der Zeitgeber "ausgeht". Was immer Sie gefragt haben, der Timer wird in einem separaten Thread ausgeführt, nicht im UI-Thread. Wenn Sie einen Hintergrund-Worker hinzufügen, wird nur ein weiterer Thread in die Gleichung eingefügt. –