Sto cercando di rendere l'applicazione C# multi-threadata perché a volte, ottengo un'eccezione che dice che ho effettuato una chiamata a un thread in un modo non sicuro. Non ho mai fatto alcuna multi-threading in un programma, quindi abbi pazienza se sembro un po 'ignorante sul problema.Chiamate multi-threading nell'applicazione Windows Forms?
La panoramica del mio programma è che voglio fare un'applicazione di monitoraggio delle prestazioni. Ciò comporta l'utilizzo della classe del contatore di processo e delle prestazioni in C# per avviare e monitorare il tempo di processore di un'applicazione e rinviarlo all'interfaccia utente. Tuttavia, nel metodo che chiama il metodo nextValue del contatore di prestazioni (che è impostato per eseguire ogni secondo grazie a un timer), a volte otterrei l'eccezione di cui sopra che parlerebbe di chiamare un thread in un modo non sicuro.
Ho allegato alcuni dei codici per la vostra lettura. So che questa è una domanda che richiede molto tempo, quindi sarei davvero grato se qualcuno potesse offrirmi un aiuto su dove creare una nuova discussione e su come chiamarla in modo sicuro. Ho provato a vedere cosa c'era su MSDN, ma questo mi ha confuso.
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;
}
Va bene, questo e il commento di sfondo operaio sembra molto utile; ma a quanto ho capito, il processo stesso è in esecuzione sul thread dell'interfaccia utente, ma devo creare una thread separata per raccogliere e aggiornare i dati su quel processo? In generale, come sarò in grado di dire dove creare un thread separato? – Waffles
Il timer eseguirà il delegato ElapsedEventHandler richiesto sul primo thread ThreadPool disponibile quando il timer "si spegne". Quindi qualunque cosa tu abbia chiesto al timer di fare avverrà su un thread separato, non sul thread dell'interfaccia utente. L'aggiunta di un lavoratore in background introdurrà solo un altro thread all'equazione. –