¿Hay alguna manera de activar un hilo que duerme en C#? Entonces, ¿duerme durante mucho tiempo y lo despiertas cuando quieres que se procese el trabajo?¿Hay alguna manera de despertar un hilo que duerme?
Respuesta
Un AutoResetEvent
objeto (u otro WaitHandle
implementación) se puede utilizar para dormir hasta que se recibe una señal de otro hilo:
// launch a calculation thread
var waitHandle = new AutoResetEvent(false);
int result;
var calculationThread = new Thread(
delegate
{
// this code will run on the calculation thread
result = FactorSomeLargeNumber();
waitHandle.Set();
});
calculationThread.Start();
// now that the other thread is launched, we can do something else.
DoOtherStuff();
// we've run out of other stuff to do, so sleep until calculation thread finishes
waitHandle.WaitOne();
Si el hilo está dentro de una llamada al Sleep
, entonces no hay (generalmente) una forma de activarlo. (La única excepción que conozco es Java, que permite que un sueño finalice antes si otro hilo llama al thread.interrupt()
.)
El patrón del que está hablando parece llamar a un evento: el hilo contiene un bucle, en la parte superior de la cual espera que ocurra un evento. Si el evento está actualmente desarmado, el hilo "duerme" hasta que otro hilo desencadene el evento. En ese punto, el hilo de dormir se despierta y continúa su trabajo, hasta la próxima vez a través del ciclo cuando duerme para esperar otro evento.
@John, agregaste tu comentario mientras editaba para agregar esa información :). –
lo suficientemente justo que voy a eliminar mi comentario :) –
¿this thread help? C# tiene good functionality para el manejo de eventos de subprocesos. He hecho la mayor parte de mi trabajo en Python, pero C# parece tener bibliotecas sólidas para el bloqueo de hilos.
La mejor solución sería utilizar Task
objetos con el valor predeterminado TaskFactory
. Esta API (presentada en .NET 4.0) utiliza un conjunto de hilos con colas de robo de trabajo y todas esas cosas elegantes.
Si .NET 4.0 no está disponible, utilice el ThreadPool
, que tiene una cola de trabajos incorporada (que hace un cierto equilibrio de grupos pero no en el mismo alcance que el grupo de subprocesos 4.0).
Si realmente debe hacerlo usted mismo, entonces te recomiendo un BlockingCollection<T>
, que es una cola de bloqueo del consumidor/productor añadió en .NET 4.0.
Si realmente debe lo hace usted mismo y no se puede utilizar .NET 4.0, a continuación, se puede utilizar una o ManualResetEvent
AutoResetEvent
junto con una cola -protected lock
de trabajo.
public void WakeUp()
{
if (Thread.CurrentThread.ThreadState == ThreadState.WaitSleepJoin)
Thread.CurrentThread.Interrupt();
}
Esto abotará el hilo y no lo despertará. – Danpe
@Danpe Dudo que aborte el hilo, entonces ¿cuál sería el sentido de llamarlo una interrupción? Lea esto: http://msdn.microsoft.com/en-us/library/system.threading.thread.interrupt(v=vs.110).aspx Tendrá que atrapar la excepción. –
Esta no es la forma de lograr lo que el OP está pidiendo. El código del hilo en sí debería tener un punto de "espera" definitivo en el que espera que el sistema operativo señale para que el hilo vuelva a procesarse. Cualquier llamada a 'Sleep' o' SpinWait' o 'Yield' pondrá el hilo en el estado' WaitSleepJoin'. – Slight
- 1. Interrumpir un hilo que duerme
- 2. Interrumpir o detener un hilo que duerme
- 3. Iniciando un hilo que duerme en .NET
- 4. ¿Hay alguna manera de detener el tiempo. ¿Duerme en Windows?
- 5. ¿Despertar un QThread que está en reposo?
- 6. C# Thread.Sleep despertar inmediatamente
- 7. Diferencia entre el hilo # ejecutar y el hilo # despertar?
- 8. ¿Hay alguna manera de hacer que un ExecutorService funcione recursivamente?
- 9. time.sleep - ¿Duerme el hilo o el proceso?
- 10. ¿Hay alguna manera de ignorar un caso que no coincide?
- 11. ¿Hay alguna manera de forzar Core Animation para que ejecute su hilo?
- 12. ¿Hay alguna manera de negar un predicado?
- 13. ¿Hay alguna manera de encontrar el hilo del propietario de un control?
- 14. ¿Hay alguna manera de hacer algo cuando un hilo Perl termina su trabajo?
- 15. hilo de Java que es mejor manera?
- 16. ¿Hay alguna manera de que Apache log logre slow requests?
- 17. ¿Hay alguna manera de comentar XAML que contiene comentarios?
- 18. ¿Hay alguna manera fácil de hacer que ScrollViewer sea "hinchable"?
- 19. ¿Hay alguna manera de hacer que Guice Grapher trabaje?
- 20. ¿Hay alguna manera de hacer que TFS se pueda enlazar?
- 21. ¿Hay alguna manera de que Asio funcione sin Boost?
- 22. ¿Hay alguna manera de hacer que UserControl sea inafocable?
- 23. ¿Hay alguna manera de inicializar un objeto mediante un hash?
- 24. ¿Hay alguna manera de encontrar un elemento en un documentFragment?
- 25. ¿Hay alguna manera de que un proceso de Android produzca un volcado dinámico en un OutOfMemoryError?
- 26. .NET ¿Hay alguna manera de obtener el id del hilo principal?
- 27. ¿Cuál es la mejor manera de hacer que un hilo indique otro hilo en .NET?
- 28. ¿Hay alguna manera de desactivar una etiqueta?
- 29. ¿Hay alguna manera de animar diseños? [Android]?
- 30. e.preventDefault - ¿hay alguna manera de hacerlo?
¿En qué configuración exactamente? Realmente necesitaríamos más información sobre la plataforma y/o el modelo de subprocesamiento que está utilizando para poder responder a esto de manera significativa. – Gian
Depende de cómo lo duerma. – zneak
Definitivamente tiene que decirnos al menos de qué lenguaje de programación se trata esta pregunta. – scy