thread resueltos reiniciar reanudar que pausar hilos ejemplos dormir detener como clase c# .net-2.0 thread-safety

c# - resueltos - ¿Cuáles son las formas alternativas de suspender y reanudar un hilo?



que es un hilo en java (6)

Ese es demasiado largo. Lo que necesito es un ejemplo rápido de códigos para usar. Encontré uno de la discusión y respondí por Mark R. Dawson en http://bytes.com/groups/net-c/458947-thread-suspend . Explica el peligro de los métodos obsoletos y cómo utilizar AutoResetEvent para notificar al segundo hilo para continuar el proceso.

Los dos métodos Thread.Suspend() y Thread.Resume() están obsoletos desde .NET 2.0. ¿Por qué? ¿Cuáles son otras alternativas y ejemplos?


Este es el mejor tutorial para Thread (para C #): http://www.albahari.com/threading/

Para esperar, necesitas usar .Join () en el hilo. Esto esperará hasta que el acabado de la banda de rodadura sea un trabajo. De lo contrario, deberá usar Esperar / Pulsar .


Estoy de acuerdo que es un gran tutorial. La razón principal por la cual Suspend () y Resume () son obsoletos es porque son métodos bastante peligrosos. En cualquier punto, Thread t podría estar haciendo cualquier cosa. Cualquier cosa. Imagina que tu hilo está leyendo un archivo y tiene un candado. Usted suspende su hilo. El archivo permanece bloqueado Lo mismo ocurre con cualquier otro recurso. Lo mismo ocurre con un bloqueo en un mutex.


Todas las buenas alternativas funcionan según el hilo llegando a un punto en el que es feliz esperar. Suspender era peligroso porque podía suspender el hilo mientras mantenía un bloqueo en un mutex, una receta para los bloqueos.

Entonces, lo que su hilo necesita es un evento manual que pueda esperar: en un momento en que sea seguro hacerlo, cuando no tenga bloqueos.


Deseará utilizar un AutoResetEvent EventWaitHandle.

Digamos que quieres hacer algo como esto ( NOTA : ¡no hagas esto!):

private Thread myThread; private void WorkerThread() { myThread = Thread.CurrentThread; while (true) { myThread.Suspend(); //Do work. } } public void StartWorking() { myThread.Resume(); }

Como otros han dicho, esta es una mala idea. Aunque solo usar Suspender en su propio hilo es relativamente seguro, nunca se puede saber si se está llamando a Currículum cuando el hilo se ha suspendido. Así que suspender y reanudar se han quedado obsoletos.

En su lugar, desea utilizar un AutoResetEvent:

private EventWaitHandle wh = new AutoResetEvent(); private void WorkerThread() { while(true) { wh.WaitOne(); //Do work. } } public void StartWorking() { wh.Set(); }

El subproceso de trabajo esperará en el identificador de espera hasta que otro subproceso llame a StartWorking. Funciona de manera muy similar a Suspender / Reanudar, ya que el AutoResetEvent solo permite "reanudar" un hilo.


puede usar ManualReset en lugar de AutoReset:

public class Worker { ManualResetEvent _shutdownEvent = new ManualResetEvent(false); ManualResetEvent _pauseEvent = new ManualResetEvent(true); Thread _thread; public Worker() { } public void Start() { _thread = new Thread(DoWork); _thread.Start(); Console.WriteLine("Thread started running"); } public void Pause() { _pauseEvent.Reset(); Console.WriteLine("Thread paused"); } public void Resume() { _pauseEvent.Set(); Console.WriteLine("Thread resuming "); } public void Stop() { // Signal the shutdown event _shutdownEvent.Set(); Console.WriteLine("Thread Stopped "); // Make sure to resume any paused threads _pauseEvent.Set(); // Wait for the thread to exit _thread.Join(); } public void DoWork() { while (true) { _pauseEvent.WaitOne(Timeout.Infinite); if (_shutdownEvent.WaitOne(0)) break; // Do the work.. Console.WriteLine("Thread is running"); } } }