2011-11-27 20 views
5

Tengo una tarea que quiero ejecutar una y otra vez. Quiero llamar esto lo más rápido posible, sin embargo, quiero mantener mis ciclos de CPU bajos. He leído usando Sleep en un backgroundworker no es la mejor opción. Sin embargo, sin dormir, mi CPU permanece alrededor del 55% por ciento. Tengo un ejemplo de mi fuente a continuación. Si dormir es lo apropiado, ¿cómo elegir el mejor momento para dormir? Como puede ver en mis resultados a continuación, obtengo resultados diferentes según el tiempo que duermo. ¿Puede alguien que me haga saber lo que es la mejor práctica cuando se hace algo similarBackgroundworker Sleep para reducir la CPU

BackgroundWorker _Worker = new BackgroundWorker() 
{ 
    WorkerReportsProgress = true, 
    WorkerSupportsCancellation = true 
}; 

void Worker_DoWork(object sender, DoWorkEventArgs e) 
{ 
    // do my task here 

    // if i uncomment one of the Sleep below I reduce the CPU like so 
    // no sleep    CPU = 52-58% 
    // Thread.Sleep(1);  CPU = 09-15% 
    // Thread.Sleep(10); CPU = 02-03% 
    // Thread.Sleep(100); CPU = 00-01% 
} 

void Worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e) 
{ 
    if (e.Cancelled) { return; } 

    _Worker.RunWorkerAsync(); 
} 
+0

Según el uso que le dé, tal vez un temporizador sea más apropiado. –

+0

Pensé en el temporizador pero mi tarea tarda de 5 segundos a 5 minutos en completarse, así que pensé que un trabajador de segundo plano sería una mejor opción. – poco

+2

¿Por qué le preocupa la CPU%? Tal vez ponerlo en un hilo de menor prioridad sería más apropiado si desea asegurarse de que el resto del sistema siga siendo receptivo. –

Respuesta

1

Con multi-threading, es común para establecer el trabajo de fondo a una prioridad más baja cuando no se quiere consumir la máquina. Utilizará cualquier CPU que sobra. Eso significa que no deberías preocuparte si va al 100%.

Pero, el problema con BackgroundWorker es que no puede establecer la prioridad.

Otra opción es engendrar su propio hilo, que puede establecer la prioridad.

Aquí hay otro relacionado SO mensaje:

.NET Backgroundworker Object's Thread Priority

Además, otra opción (probablemente menos atraído a) es poner el trabajo pesado en otro proceso y hacer que se ejecutan baja prioridad. Si no necesita comunicar mucho progreso, es simple. De lo contrario, es más complejo abrir un canal de comunicación.

How do I launch a process with low priority? C#

0

Dando a su fondo enhebrar una prioridad más baja se asegurará que su procesamiento no interfiere con otras funciones (sólo le dan una prioridad suficientemente baja). Sin embargo, ¿es esa una solución para ti? Desea que el trabajo de fondo se ejecute continuamente. Tal vez correr despacio no es una buena opción para ti?

¿Qué es realmente tratando de lograr?

1

El dormir determinista no es la mejor optimización que puede tener en la mayoría de los escenarios (es solo un número al azar en su caso y no una optimización perfecta que pueda tener), rather wait and signal es la mejor opción. Puede intentar bajar la prioridad de subprocesos por ahora, pero le recomiendo obtener el mejor paradigma de espera y señal de uso de rendimiento