2012-02-23 19 views
16

Siempre veo personas usando Thread.Sleep() por crear demoras en el procesamiento o algo similar y siempre se ridiculiza a las personas por usarlo de esta manera.¿Cuándo es sensato usar Thread.Sleep()?

¿Cuándo es sensato/obligatorio utilizar Thread.Sleep()?

+0

¿Por qué la gente ha votado esta pregunta sin ninguna explicación de por qué? – ediblecode

+0

-1 Elija un idioma. La respuesta a esta pregunta hará referencia a otras bibliotecas. Es confuso hacer esta pregunta sobre dos idiomas diferentes al mismo tiempo. –

+1

@ErickRobertson ¿Entonces estás diciendo que deberían crearse dos preguntas? Me parece un poco sin importancia. – ediblecode

Respuesta

22

Debe llamar al Thread.sleep() cuando realmente necesite un retraso en un hilo de fondo.

No lo llame para ayudar a la sincronización (no lo hará), no lo llame en un bucle para esperar algo (será lento) y nunca lo llame en un hilo de interfaz de usuario (se congelará)

+10

Solo para agregar: Y tampoco intente construir un temporizador preciso con Thread.Sleep. –

+0

Uso 'Thread.Sleep' en un hilo de fondo mientras realizo un procesamiento largo en un conjunto de archivos o un conector de red (y realizo una devolución de llamada cuando se completa el hilo). ¿Es esto un buen uso para 'Thread.Sleep' o hay un mejor mecanismo para hacer esto? – Matthew

+0

@Matthew Parece que podría estar usando dos hilos para hacer el trabajo de un hilo. ¿El hilo de dormir hace algo aparte de despertarse periódicamente y verificar si un hilo de trabajo todavía está funcionando? ¿No puede el subproceso de trabajo invocar la devolución de llamada cuando se hace? –

-2

si quieres que un hilo deje de hacer algo, a veces cuando haces un bucle infinito, no quieres que el ciclo vaya ininterrumpidamente, ya que también tomará mucha potencia de la CPU, añadiendo un hilo. Duerme en él hará que el ciclo "tome un descanso" y le dará a la CPU un poco de descanso ^^.

+0

Si alguna vez vas a programar algo así, ¿no es cierto? use un temporizador? – ediblecode

+1

¿Cómo utiliza un temporizador para reemplazar una llamada sleep()? Suponga que está en un evento de secuencia de comandos-intérprete 'OnProcessLine', una profundidad desconocida en la pila de uno de varios subprocesos que ejecutan scripts diferentes , y desea hacer una pausa de 10 ms. ¿Cómo lo hace con un temporizador? –

0

Se puede usar para forzar un cambio de contexto (con un parámetro de 1) o para ceder a otros hilos de mayor prioridad (con un parm de 0) .... pero eso rara vez es necesario.

5

Cuando necesite 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 intenta 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().

Más (de nuevo, NET-céntrica) explicación de las desventajas de dormir() en este artículo: Thread.Sleep is a sign of a poorly designed program.

+1

+1 tiene muchos usos de código no de producción. También es útil para demostrar tareas de ejecución prolongada al desarrollar/demostrar marcos multiproceso, etc. sabiendo que es sólo un soporte para el trabajo real. – Servy

+0

He leído ese artículo vinculado antes. Acabo de leerlo otra vez. Fue malo. Lo peor es la segunda vez. –

3

Al escribir código de prueba. Si desea ver cómo se maneja una función, varios hilos la invocan al azar.

Además, si desea simular un retraso para la prueba. Digamos que quería probar una barra de progreso.

3

Hay muy pocas situaciones en las que lo consideraría aceptable. En última instancia, se trata de las siguientes condiciones en mi mente: otros pueden sonar en casos en que estos no se aplican, pero como regla general TODO lo siguiente tendría que ser cierto para mí para usar Thread.Sleep en producción (aka no trivial o pruebas) código:

  1. Usted está en espera de un recurso
  2. el recurso en cuestión no proporciona notificación proactiva adecuada de preparación (un WaitHandle o algo así)
  3. no se puede modificar de otro modo el recurso en cuestión para hacerlo
  4. Ha medido y sabe que debe esperar lo suficiente para que un SpinWait no esté justificado, d que obtienes un mejor rendimiento al abandonar el contexto.
0

Si necesita Thread.Sleep puede tener un diseño incorrecto. Es mejor usar mecanismos de sincronización como AutoResetEvent o ManualResetEvent y esperar a que ocurran los eventos. A menudo he visto el sondeo realizado con Thread.Sleep, pero es mejor intentar usar eventos si es posible.

+1

Esta respuesta ofrece no hay respuesta a la pregunta – ediblecode

+0

Quiero decirte que nunca debes usar Thread.Sleep y utilizar mejor los mecanismos de eventos. Esa es mi respuesta a su pregunta, tal vez no estaba claro. – BlueM

+0

Y como se menciona en una respuesta anterior en http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx de hecho es un signo de mal diseño. "En .NET no hay otra razón para usarlo". – BlueM

0

Las quejas sobre el uso del sueño generalmente se relacionan con el diseño eficaz (o bastante ineficaz) de varios hilos.Multi-threading es un tema enorme, y simplemente lo referiría a un buen libro sobre él (Java Concurrency in Practice de Goetz).

Si desea retrasar su código de procesamiento durante un período de tiempo fijo, entonces sleep() es una buena cosa (sin embargo, la clase Timer es una buena forma de implementar un comportamiento periódico).

+0

Los temporizadores obligan a los desarrolladores a desarrollar máquinas de estado para implementar especificaciones de procedimiento. Si una operación se define mediante secuencias de etapas más simples, a menudo separadas por intervalos largos, las llamadas a funciones y las llamadas a dormir() se asignan directamente a esto. Una máquina de estado asíncrona no. –

+0

'Las quejas sobre el uso del sueño generalmente se relacionan con el diseño eficaz (o bastante ineficaz) de varios hilos.' Esto es muy cierto pero, lamentablemente, esto se traduce en algunas mentes en 'Sleep() es un antipatrón'. "Todos los años, los bomberos, las ambulancias y los cruceros de policía causan cientos de accidentes de tráfico, por lo que deberían prohibirse". –

-1

Úselo siempre que necesite una larga pausa en sus operaciones. Si la especificación dice 'ahora espere al menos 10 segundos antes de continuar', luego llame a suspensión (10000). Existe una alternativa: puede reescribir su código como un motor de estado para que el control pueda ser entregado hasta que se active un evento de temporizador. Una máquina de estado basada en tablas es muy flexible y permite una operación completamente asíncrona. El 'código' resultante probablemente no se parecerá a la especificación de requisitos de ninguna manera, será casi imposible entender lo que está pasando, difícil de depurar y una pesadilla para modificar, mantener y/o mejorar, pero podrá evitar esa desagradable , anti-patrón 'Sueño (10000)' llamada.

Como han publicado otros, ¡no lo use para comunicaciones entre hilos! Todos los sistemas operativos multitarea tienen muchos mecanismos sychro que son más efectivos.

Cuestiones relacionadas