example - remarks c#
Hilo. Dormir o Hilo. Rendimiento (1)
Thread.Yield interrumpirá el hilo actual para permitir que otros hilos funcionen. Sin embargo, si no tienen ningún trabajo que hacer, su hilo pronto será reprogramado y continuará su sondeo, por lo tanto, 100% de utilización de 1 núcleo.
Hace que el subproceso de llamada ceda la ejecución a otro subproceso que esté listo para ejecutarse en el procesador actual. El sistema operativo selecciona el hilo para ceder.
Thread.Sleep programará tu hilo para que se ejecute nuevamente después de que el tiempo de espera expire, por lo tanto, una utilización de la CPU mucho menor.
Bloquea el subproceso actual durante el número especificado de milisegundos.
Dada la opción entre los dos, Thread.Sleep
es más adecuado para su tarea. Sin embargo, estoy de acuerdo con el comentario de @Bryan de que un Threading.Timer
hace una solución más elegante.
Tengo un método que usa un trabajador de fondo para sondear una DLL para un estado que se parece a esto:
var timeout = DateTime.Now.AddSeconds(3);
while (System.Status != Status.Complete // our status is not complete
&& DateTime.Now < timeout // have not timed out
&& !_Worker.CancellationPending) // backgroundworker has not been canceled
{
//Thread.Yield();
//Thread.SpinWait(1);
//Thread.Sleep(1);
}
Cuando veo mi% de CPU, el yield()
y spinwait()
hacen que mi aplicación se dispare hasta un 50% en mi PC. Con Sleep(1)
mi CPU% se mantiene en 6%. Me han dicho que debería elegir Thread.Yield()
, sin embargo, los picos en la CPU% me molestan. ¿Cuál es la mejor práctica para algo como esto?