Reanudando # hilos C
-
21-09-2019 - |
Pregunta
Posible duplicado pregunta: ¿Hay una manera de hacer una pausa indefinida un hilo?
En mi código hago el siguiente
Thread mainThread
//...
mainThread.Resume();
void StartThread()
{
while (!wantQuit)
{
db.runEmail();
mainThread.Suspend();
}
}
A continuación, me sale la excepción abajo porque me llamo hoja de vida cuando ya no haya sido suspendido.
System.Threading.ThreadStateException
Me he dado cuenta esta advertencia
warning CS0618: 'System.Threading.Thread.Resume()' is obsolete: 'Thread.Resume has been deprecated. Please use other classes in System.Threading, such as Monitor, Mutex, Event, and Semaphore, to synchronize Threads or protect resources. http://go.microsoft.com/fwlink/?linkid=14202'
Así que me pregunto ¿hay alguna manera de reanudar e ignorar la excepción / caso de que no se suspende? No me gusta escribir el siguiente en lugar de una sola línea
try
{
mainThread.Resume();
}
catch (System.Threading.ThreadStateException e)
{
}
Solución
La solución fácil es fijar su lógica y no llame Reanudar () cuando no está en suspensión ().
Sin embargo, la reanudación / Suspender API está hecho obsoleta, echar un vistazo a, por ejemplo:
1) Monitorear , Wait () y el pulso ()
2) AutoResetEvent o ManualResetEvent, Conjunto () y WaitOne ()
El monitor de clase estática es un poco más fácil de usar y se integra con lock() {}
, sino una ResetEvent podría ser más apropiado en este caso porque se puede crear en conjunto o en modo desconectado y que son menos propensos a una señal de 'señorita'. Por el contrario, un Monitor.Pulse () solo se perderá cuando la espera () ocurre más tarde.
Will inserta un enlace en su pregunta, y mientras yo no considero que sea un duplicado, la respuesta aceptada no es muy adecuado para curar el uso de suspender / reanudar.
Otros consejos
WaitHandles son un mejor enfoque aquí.
En lugar de la suspensión de su hilo, tiene que esperar en una WaitHandle. Cuando esté listo para volver a empezar, se "ajusta" la manija desde el otro hilo.
Para obtener un ejemplo de código, consulte la documentación de de MSDN de ManualResetEvent .
Es posible que desee echar un vistazo a el uso de un controlador de hilo en este caso.
Puede comprobar Thread.ThreadState y comprobar ThreadState.Suspended antes de reanudar.