Pregunta

Antes de personas sugieren que: No estoy usando Thread.sleep para lo , excepto tratar de encontrar una manera de trabajar alrededor de ella. Estoy tratando de manejar futuro código de otras personas que pueden no ser .Sleep () libre. Tengo una muy buena comprensión de lo horrible que es para la sincronización de las cosas.

Acepto un hilo en un trozo de mi código. Deseo ser capaz de establecer un límite a la vida de este hilo. Mi método usual de hacerlo es la siguiente:

Thread outer = new Thread(() =>
{
    externalThread.Start();
    externalThread.Join();
});
outer.Start();
outer.Join(lifetime);
if (outer.ThreadState != ThreadState.Stopped)
{
    outer.Abort();
}
inner.Join();

Desde entonces, he descubierto que al parecer no puedo despertar un hilo de dormir antes de que acabe el sueño. Para empeorar las cosas, esto todavía escribe en la consola si le doy una vida útil de 10 milisegundos:

new Thread(() => { Thread.Sleep(2000); Console.WriteLine("second"); })

A pesar de que cuenta .Abort () no es un disco-límite de ejecución del hilo. Parece 2 segundos serían suficientes de una advertencia, pero supongo que no ...

He intentado comprobar el estatus WaitSleepJoin y .Interrupt (); se bloquea el hilo, o se produce una excepción (lo siento, sin saber cuál. Windows me chocó si no hay depurador de correr dice, y si se está ejecutando se ejecuta como si la interrupción no se llamaba), y todavía escribe en la consola después de 2 segundos . .Resume () aparentemente no hace nada para un hilo de dormir.

es Hay una manera de despertar a un hilo, sin esperar a que su sueño a punto de expirar? Yo entiendo que la parada no es "inmediata", por lo que puede ser llamado Console.WriteLine independientemente; es de 2 segundos de espera que me está molestando. ¿Y si es una espera de 10 días? Ya que no puedo controlar los hilos que vienen en, no tengo manera de saber, y parece que no hay forma de prevención tal cosa ...

¿Fue útil?

Solución

No hay ninguna manera de reactivar un hilo de un sueño. Sólo se puede abortar un hilo llamando a abortar o de interrupción (ambos de los cuales lanzar una ThreadAbortException).

Sin embargo, a la dirección que usted pregunta de por qué cuando se ejecuta:

new Thread(() => { Thread.Sleep(2000); Console.WriteLine("second"); })

10 ms de tiempo de espera con unas impresiones todavía, es porque su código para controlar el tiempo de vida de rosca no hace lo que quiere hacer.

Así que tienes externalThread y externo. Se empieza exterior (que se inicia un nuevo hilo, le llaman hilo 1) y de inicio de la llamada externa en la rosca externa (que se inicia un nuevo hilo, le llaman rosca 2). Así que usted acaba de comenzar dos nuevos temas.

Cuando se llama a outer.About(), que aborta único hilo 1. El hilo comenzado llamando externalThread.Start(), hilo 2 continúa la ejecución hasta su finalización, ya que nada se aborta.

No estoy seguro de lo que su están tratando de lograr con la rosca externa adicional. Esto no sería más simple:

externalThread.Start();
externalThread.Join(lifetime);
if (externalThread.ThreadState != ThreadState.Stopped)
{
    externalThread.Abort();
}

Otros consejos

Uso WaitOne temporizador para hilos de control de origen desconocido +.

o si desea tener un control sobre el código trabajador de la rosca:

manera un poco hacky, para lograr más "sensible sueño" cuando no le gustaba temporizadores / otros hilos utilizarse para activar el hilo hacia arriba

utilizarlo en lugar de Thread.Sleep normales

    private void WaitFor(int milis)
    {
        const int interval = 500;

        if (milis <= interval)
        {
            throw new ArgumentException();
        }

        var sections = milis / interval;
        for (var s = 0; s < sections && (!ShouldQuit); ++s)
        {
            Thread.Sleep(interval);
        }
    }

cuenta de la bandera ShouldQuit, siendo un campo de clase accesible desde ambos hilos

Por supuesto, esto tiene peores características de uso de la CPU que espera evento basado / temporizador

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