Después de llamar a dormir en un método, ¿el programa continuará ejecutándose en segundo plano (sin crear un nuevo hilo)? Además, si llamo a dormir en un nuevo hilo, ¿continuará el hilo principal su trabajo?
Jay Nirgudkar
@JayNirgudkar se detendrá el hilo que llama Sleep. Otros hilos no se ven afectados.
Isak Savo
No se garantiza que esto sea exacto.
Akumaburn
150
Básicamente hay 3 opciones para esperar (casi) cualquier lenguaje de programación:
Espera floja
Ejecutar bloques de subprocesos durante un tiempo determinado (= no consume potencia de procesamiento)
No es posible procesar el hilo bloqueado / en espera
No tan preciso
Espera apretada (también llamada lazo cerrado)
el procesador está MUY ocupado durante todo el intervalo de espera (de hecho, generalmente consume el 100% del tiempo de procesamiento de un núcleo)
Algunas acciones se pueden realizar mientras se espera
Muy preciso
Combinación de 2 anteriores
Por lo general, combina una eficiencia de procesamiento de 1. y precisión + capacidad para hacer algo de 2.
para 1. - Suelta esperando en C #:
Thread.Sleep(numberOfMilliseconds);
Sin embargo, el programador de subprocesos de Windows hace que la precisión Sleep()sea de alrededor de 15 ms (por lo que el modo de suspensión puede esperar fácilmente 20 ms, incluso si está programado para esperar solo 1 ms).
para 2. - La espera apretada en C # es:
Stopwatch stopwatch =Stopwatch.StartNew();while(true){//some other processing to do possibleif(stopwatch.ElapsedMilliseconds>= millisecondsToWait){break;}}
También podríamos usar DateTime.Nowu otros medios de medición del tiempo, pero Stopwatches mucho más rápido (y esto realmente se haría visible en un circuito cerrado).
para 3. - Combinación:
Stopwatch stopwatch =Stopwatch.StartNew();while(true){//some other processing to do STILL POSSIBLEif(stopwatch.ElapsedMilliseconds>= millisecondsToWait){break;}Thread.Sleep(1);//so processor can rest for a while}
Este código bloquea regularmente el subproceso durante 1 ms (o un poco más, según la programación del subproceso del sistema operativo), por lo que el procesador no está ocupado durante ese tiempo de bloqueo y el código no consume el 100% de la potencia del procesador. Todavía se puede realizar otro procesamiento en el bloqueo intermedio (como: actualización de la interfaz de usuario, manejo de eventos o interacción / comunicación).
No puede especificar un tiempo de suspensión exacto en Windows. Necesitas un sistema operativo en tiempo real para eso. Lo mejor que puede hacer es especificar un tiempo mínimo de sueño. Luego, depende del planificador activar su hilo después de eso. Y nunca llame .Sleep()al hilo GUI.
El subproceso no se programará para su ejecución por el sistema operativo durante el tiempo especificado. Este método cambia el estado del hilo para incluir WaitSleepJoin.
Este método no realiza el bombeo estándar de COM y SendMessage. Si necesita dormir en un subproceso que tiene STAThreadAttribute, pero desea realizar un bombeo COM y SendMessage estándar, considere usar una de las sobrecargas del método Join que especifica un intervalo de tiempo de espera.
usingSystem.Runtime.InteropServices;[DllImport("winmm.dll",EntryPoint="timeBeginPeriod",SetLastError=true)]privatestaticexternuintTimeBeginPeriod(uint uMilliseconds);[DllImport("winmm.dll",EntryPoint="timeEndPeriod",SetLastError=true)]privatestaticexternuintTimeEndPeriod(uint uMilliseconds);/**
* Extremely accurate sleep is needed here to maintain performance so system resolution time is increased
*/privatevoid accurateSleep(int milliseconds){//Increase timer resolution from 20 miliseconds to 1 milisecondTimeBeginPeriod(1);Stopwatch stopwatch =newStopwatch();//Makes use of QueryPerformanceCounter WIN32 API
stopwatch.Start();while(stopwatch.ElapsedMilliseconds< milliseconds){//So we don't burn cpu cyclesif((milliseconds - stopwatch.ElapsedMilliseconds)>20){Thread.Sleep(5);}else{Thread.Sleep(1);}}
stopwatch.Stop();//Set it back to normal.TimeEndPeriod(1);}
Respuestas:
Sin embargo, recuerde que hacer esto en el hilo principal de la GUI bloqueará la actualización de su GUI (se sentirá "lenta")
Simplemente elimine
;
para que funcione también para VB.net.fuente
Básicamente hay 3 opciones para esperar (casi) cualquier lenguaje de programación:
para 1. - Suelta esperando en C #:
Sin embargo, el programador de subprocesos de Windows hace que la precisión
Sleep()
sea de alrededor de 15 ms (por lo que el modo de suspensión puede esperar fácilmente 20 ms, incluso si está programado para esperar solo 1 ms).para 2. - La espera apretada en C # es:
También podríamos usar
DateTime.Now
u otros medios de medición del tiempo, peroStopwatch
es mucho más rápido (y esto realmente se haría visible en un circuito cerrado).para 3. - Combinación:
Este código bloquea regularmente el subproceso durante 1 ms (o un poco más, según la programación del subproceso del sistema operativo), por lo que el procesador no está ocupado durante ese tiempo de bloqueo y el código no consume el 100% de la potencia del procesador. Todavía se puede realizar otro procesamiento en el bloqueo intermedio (como: actualización de la interfaz de usuario, manejo de eventos o interacción / comunicación).
fuente
No puede especificar un tiempo de suspensión exacto en Windows. Necesitas un sistema operativo en tiempo real para eso. Lo mejor que puede hacer es especificar un tiempo mínimo de sueño. Luego, depende del planificador activar su hilo después de eso. Y nunca llame
.Sleep()
al hilo GUI.fuente
Como ahora tiene la función async / wait, la mejor manera de dormir durante 50 ms es mediante Task.Delay:
O si está apuntando a .NET 4 (con Async CTP 3 para VS2010 o Microsoft.Bcl.Async), debe usar:
De esta manera no bloqueará el hilo de la interfaz de usuario.
fuente
FlushAsync
versión.async
declaración es llamarTask.Delay(50).Wait();
Usa este código
fuente
El subproceso no se programará para su ejecución por el sistema operativo durante el tiempo especificado. Este método cambia el estado del hilo para incluir WaitSleepJoin.
Este método no realiza el bombeo estándar de COM y SendMessage. Si necesita dormir en un subproceso que tiene STAThreadAttribute, pero desea realizar un bombeo COM y SendMessage estándar, considere usar una de las sobrecargas del método Join que especifica un intervalo de tiempo de espera.
fuente
Para facilitar la lectura:
fuente
A partir de .NET Framework 4.5, puede usar:
fuente
Lo mejor de ambos mundos:
fuente