Red de conocimientos turísticos - Conocimientos sobre calendario chino - Acerca de los problemas de recuperación y suspensión de subprocesos de C#

Acerca de los problemas de recuperación y suspensión de subprocesos de C#

Está obsoleto el uso de los métodos Thread...::.Suspend

y Thread...::.Resume para suspender y reanudar subprocesos. Puede utilizar AutoResetEvent

para controlar la suspensión y reanudación, y Sleep para pausar la ejecución del subproceso.

AutoResetEvent permite que los hilos se comuniquen entre sí a través de señales. Normalmente, esta comunicación implica recursos a los que el hilo necesita acceso exclusivo.

El hilo espera la señal llamando a

WaitOne de AutoResetEvent. Si AutoResetEvent está en un estado de no terminación, el subproceso se bloquea y espera a que el subproceso que actualmente controla el recurso indique que el recurso está disponible llamando a Set.

Llame a Set para indicarle a AutoResetEvent que libere el hilo en espera. AutoResetEvent permanecerá en el estado terminado hasta que se libere el hilo en espera y luego volverá automáticamente al estado no terminado. Si no hay subprocesos en espera, el estado terminado permanece indefinidamente.

El estado inicial de un AutoResetEvent se puede controlar pasando un valor booleano al constructor, que es

verdadero si el estado inicial finaliza y falso en caso contrario.

En términos sencillos, la única forma de controlar el estado inicial de un AutoResetEvent es esperar a que myResetEven.Set() se ejecute correctamente. Solo después de que myResetEven.Set () se ejecute correctamente, WaitOne () tendrá la oportunidad de ejecutarse; Set es una señal y WaitOne es una señal de espera. Solo cuando se envíe la señal, se ejecutará el programa en espera. Si no se envía, el programa posterior a WaitOne nunca se ejecutará.

clase Clase1

{

public static bool ok = false;

static AutoResetEvent are = new AutoResetEvent(false);

p>

public void add() {

while(true){

if (ok)

{

Consola .WriteLine("hola");

Thread.Sleep(1000);

}

else {

Console.WriteLine( "Esperé");

are.WaitOne();

}

}

}

public static void comenzar(){

ok = true

son .Set()

}

final vacío estático público ()

{

ok = false

}

}

clase; Programa

{

public static void Main(String[] args) {

Thread t = new Thread(new ThreadStart(new Class1().begin(

for (int i = 0; i lt; 10; i)

{

Console.WriteLine(i); p> Thread.Sleep (1000);

}

Class1.end();

t.Abort()

Console.WriteLine( t.Name "Estado: " t.ThreadState);

Console.ReadLine()

}

}

}<; /p>

Clase1.

"text/javascript" src="../css/tongji.js">