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)
        {
        }
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top