Estoy tratando de hacer que mi aplicación C# tenga varios hilos porque a veces recibo una excepción que dice que he llamado a un hilo de una manera insegura. Nunca antes he hecho múltiples subprocesos en un programa, así que tengan paciencia si me parece un poco ignorante sobre el tema.llamadas multihilo en la aplicación Windows Forms?
La visión general de mi programa es que quiero hacer una aplicación de monitoreo de rendimiento. Lo que esto implica es utilizar la clase de contador de proceso y rendimiento en C# para iniciar y controlar el tiempo de procesador de una aplicación, y devolver ese número a la IU. Sin embargo, en el método que realmente llama al método nextValue del contador de rendimiento (que está configurado para funcionar cada segundo gracias a un temporizador), a veces recibo la excepción antes mencionada que habla de llamar a un hilo de una manera insegura.
He adjuntado parte del código para su lectura. Sé que esta es una pregunta que lleva mucho tiempo, por lo que estaría muy agradecido si alguien pudiera ofrecerme ayuda sobre dónde crear un nuevo hilo y cómo llamarlo de manera segura. Traté de ver qué pasaba en MSDN, pero eso me confundió un poco.
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;
}
Vale, esto y el comentario trabajador de fondo parece bastante útil; pero, según tengo entendido, el proceso en sí se ejecuta en el hilo de la interfaz de usuario, pero tengo que crear un hilo separado para recopilar y actualizar datos sobre ese proceso. En general, ¿cómo podré decir dónde hacer un hilo por separado? – Waffles
El temporizador ejecutará el delegado ElapsedEventHandler solicitado en el primer subproceso ThreadPool disponible cuando el temporizador "se apaga". Entonces, cualquier cosa que le pida al temporizador que haga se producirá en un hilo separado, no en el hilo de la interfaz de usuario. Agregar un trabajador de fondo simplemente introducirá otro hilo en la ecuación. –