Cómo terminar un hilo en C#

En C#, un subproceso se puede terminar con el método Abort() . Abort() lanza ThreadAbortException al subproceso en el que llamó. Debido a esta excepción, el subproceso se termina. Hay dos métodos en la lista de sobrecarga de Thread.Abort Methodla siguiente manera:

  1. Abortar()
  2. Abortar (Objeto)

Abortar()

Este método genera un ThreadAbortException en el subproceso en el que se invoca, para comenzar el proceso de finalización del subproceso. Generalmente, este método se usa para terminar el hilo.

Sintaxis:

public void Abort();

Excepciones:

  • SecurityException : si la persona que llama no tiene el permiso requerido.
  • ThreadStateException : si el subproceso que se está cancelando está actualmente suspendido.

Ejemplo:

// C# program to illustrate the
// concept of Abort() method
// on a single thread
using System;
using System.Threading;
  
class ExampleofThread {
  
    // Non-Static method
    public void thread()
    {
        for (int x = 0; x < 3; x++) {
            Console.WriteLine(x);
        }
    }
}
  
// Driver Class
class ThreadExample {
  
    // Main method
    public static void Main()
    {
  
        // Creating instance for mythread() method
        ExampleofThread obj = new ExampleofThread();
  
        // Creating and initializing threads
        Thread thr = new Thread(new ThreadStart(obj.thread));
        thr.Start();
  
        Console.WriteLine("Thread is abort");
  
        // Abort thr thread
        // Using Abort() method
        thr.Abort();
    }
}

Producción:

Thread is abort

Explicación: El ejemplo anterior muestra el uso del método Abort() que proporciona la clase Thread. Al usar thr.Abort();la declaración, podemos terminar la ejecución de thr thread.

Abortar (Objeto)

Este método genera un ThreadAbortException en el subproceso en el que se invoca, para comenzar el proceso de finalización del subproceso y, al mismo tiempo, proporciona información de excepción sobre la finalización del subproceso. Generalmente, este método se usa para terminar el hilo.

Sintaxis:

public void Abort(object information);

Aquí, la información contiene cualquier información que desee pasar en un subproceso cuando se detiene. Solo se puede acceder a esta información mediante el uso de la propiedad ExceptionState de ThreadAbortException .

Excepciones:

  • SecurityException : si la persona que llama no tiene el permiso requerido.
  • ThreadStateException : si el subproceso que se está cancelando está actualmente suspendido.

Ejemplo:

// C# program to illustrate the
// concept of Abort(object)
using System;
using System.Threading;
  
class ExThread {
  
    public Thread thr;
  
    public ExThread(string name)
    {
        thr = new Thread(this.RunThread);
        thr.Name = name;
        thr.Start();
    }
  
    // Enetring point for thread
    void RunThread()
    {
        try {
            Console.WriteLine(thr.Name +
                        " is starting.");
  
            for (int j = 1; j <= 100; j++) 
            {
                Console.Write(j + " ");
                if ((j % 10) == 0) 
                {
                    Console.WriteLine();
                    Thread.Sleep(200);
                }
            }
            Console.WriteLine(thr.Name + 
                  " exiting normally.");
        }
        catch (ThreadAbortException ex) {
            Console.WriteLine("Thread is aborted and the code is "
                                             + ex.ExceptionState);
        }
    }
}
  
// Driver Class
class GFG {
  
    // Main method
    static void Main()
    {
  
        // Creating object of ExThread
        ExThread obj = new ExThread("Thread ");
        Thread.Sleep(1000);
        Console.WriteLine("Stop thread");
        obj.thr.Abort(100);
  
        // Waiting for a thread to terminate.
        obj.thr.Join();
        Console.WriteLine("Main thread is terminating");
    }
}

Producción:

Thread  is starting.
1 2 3 4 5 6 7 8 9 10 
11 12 13 14 15 16 17 18 19 20 
21 22 23 24 25 26 27 28 29 30 
31 32 33 34 35 36 37 38 39 40 
41 42 43 44 45 46 47 48 49 50 
Stop thread
Thread is aborted and the code is 100
Main thread is terminating

Puntos importantes:

  • Puede ocurrir un interbloqueo si el subproceso que llama a los métodos Abort tiene un bloqueo que requiere el subproceso abortado.
  • Si se llama al método Abort en un subproceso que no se ha iniciado, ese subproceso se cancelará cuando se llame a Start.
  • Si se llama al método Abort en un subproceso que está bloqueado o inactivo, el subproceso se interrumpirá y luego se cancelará.
  • Si se llama al método Abort en un subproceso suspendido, ThreadStateException se lanza un en el subproceso que llamó a Abort, y se agrega AbortRequested a la propiedad ThreadState del subproceso que se está cancelando.
  • No se lanza una ThreadAbortException en el subproceso suspendido hasta que se llama a Resume .
  • Si se llama al método Abort en un subproceso administrado que actualmente está ejecutando código no administrado, ThreadAbortException no se lanza hasta que el subproceso vuelve al código administrado.
  • Si dos llamadas a Abort llegan al mismo tiempo, entonces es posible que una llamada configure la información de estado y la otra llamada ejecute Abort. Pero, una aplicación no puede detectar esta situación.
  • Después de llamar a Abort en un subproceso, el estado del subproceso incluye AbortRequested . Una vez que el subproceso finaliza debido al resultado de una llamada exitosa a Abort, el estado del subproceso cambia a Detenido. Con suficientes permisos, un subproceso que es el objetivo de un aborto puede cancelar el aborto utilizando el método ResetAbort .

Referencia:

Publicación traducida automáticamente

Artículo escrito por ankita_saini y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *