pause - thread c#
¿Cuándo es sensato utilizar Thread.Sleep()? (9)
Úselo siempre que necesite una pausa larga en sus operaciones. Si la especificación dice ''ahora espere al menos 10 segundos antes de continuar'', entonces llame al modo de espera (10000). Hay una alternativa: puede volver a escribir su código como un motor de estado para que el control se pueda entregar hasta que se active un evento de temporizador. Una máquina de estados accionada por mesa es muy flexible y permite una operación completamente asíncrona. El ''código'' resultante probablemente no se asemejará a la especificación de requisitos de ninguna manera, será casi imposible entender lo que está sucediendo, es difícil de depurar y una pesadilla para modificar, mantener y / o enchapar, pero podrá evitar esa desagradable , llamada anti-patrón ''Sleep (10000)''.
Como otros han publicado, ¡no lo use para comunicaciones entre subprocesos! Todos los sistemas operativos multitarea tienen muchos mecanismos de sychro que son más efectivos.
Siempre veo personas que usan Thread.Sleep()
para crear retrasos en el procesamiento o algo similar, y las personas siempre son ridiculizadas por usarlo de esta manera.
¿Cuándo es sensato / necesario usar Thread.Sleep()
?
Al escribir código de prueba. Si desea ver cómo se maneja una función por varios subprocesos al azar.
Además, si desea simular un retraso para la prueba. Digamos que querías probar una barra de progreso.
Cuando necesita introducir una pausa en algún código desechable o de prueba, Thread.Sleep () está bien.
En el código de producción, es mejor tratar de encontrar una opción diferente. Por ejemplo, si está intentando hacer algo en un intervalo, use una de las muchas clases de temporizador preexistentes. Si está intentando pausar cuando una cola de entrada se vacía (y en .NET), considere usar Monitor.Wait()
y Monitor.Pulse()
lugar.
Más explicación (nuevamente, centrada en .NET) de las desventajas de Sleep () en este artículo: Thread.Sleep es un signo de un programa mal diseñado.
Debería llamar a Thread.sleep()
cuando realmente necesite un retraso en un subproceso en segundo plano.
No lo llames para ayudar a la sincronización (no lo hará), no lo llames en un bucle para esperar algo (será lento) y nunca lo llames en un hilo de UI (se congelará).
Hay muy pocas situaciones en las que lo consideraría aceptable. En última instancia, todo se reduce a las siguientes condiciones en mi mente; otros pueden agregarse a los casos en los que no se aplican, pero como regla de oro TODO lo siguiente debería ser cierto para que use Thread.Sleep en producción ( también conocido como no trivial o código de prueba:
- Estás esperando un recurso
- El recurso en cuestión no proporciona una notificación proactiva adecuada de preparación (un WaitHandle o algo así)
- De lo contrario no puede modificar el recurso en cuestión para hacerlo.
- Ha medido y sabe que necesita esperar el tiempo suficiente para que un SpinWait no esté justificado y que obtenga un mejor rendimiento al salir del contexto.
Las quejas sobre el uso del sueño generalmente se relacionan con un diseño de subprocesos múltiples efectivo (o más bien ineficaz). El subprocesamiento múltiple es un tema enorme, y simplemente lo recomendaría a un buen libro (Java Concurrency in Practice by Goetz).
Si desea retrasar su código de procesamiento por un período de tiempo fijo, entonces dormir () es algo bueno (sin embargo, la clase Timer es una buena forma de implementar un comportamiento periódico).
Se puede usar para forzar un cambio de contexto (con un parámetro de 1) o para ceder a otros subprocesos de mayor prioridad (con un parámetro de 0) ... pero eso rara vez es necesario.
Si desea que un subproceso deje de hacer algo, a veces cuando hace un bucle sin fin, no quiere que el bucle no se detenga, porque también tomará mucha potencia de la CPU, agregando un subproceso. Dormir en él hará que el bucle "Tómate un descanso" y dale un descanso a la CPU ^^.
Si necesitas Thread.Sleep
puedes tener el diseño equivocado. Utilice mejor los mecanismos de sincronización como AutoResetEvent o ManualResetEvent y espere a que ocurran los eventos. A menudo he visto Polling hecho con Thread.Sleep
pero es mejor intentar usar eventos si es posible.