La definición y el uso de subprocesos de C#.

introducción

En el lenguaje de programación C#, los subprocesos son un mecanismo de ejecución concurrente que permite a un programa realizar múltiples tareas al mismo tiempo. El uso de subprocesos nos permite utilizar el procesador multinúcleo de la computadora para implementar la ejecución paralela de programas y mejorar el rendimiento y la capacidad de respuesta del sistema. Este artículo presentará en detalle la definición y el uso de subprocesos en C#, y cubrirá la creación, el inicio, la sincronización y la administración de subprocesos.
Insertar descripción de la imagen aquí



Conceptos básicos de hilos.

Antes de entrar en la definición y el uso de subprocesos, primero comprendamos algunos conceptos básicos relacionados con los subprocesos:

  • Subproceso: el subproceso es la unidad más pequeña de programación del sistema operativo y representa una secuencia de ejecución independiente. Un proceso puede contener varios subprocesos, cada subproceso tiene su propia ruta de ejecución y estado de ejecución.

  • Hilo principal: el hilo principal es el hilo de entrada del programa y es responsable de ejecutar la lógica principal del programa. En C#, el método Main() se ejecuta en el hilo principal.

  • Subprocesos múltiples: subprocesos múltiples se refiere a un programa que contiene múltiples subprocesos que se ejecutan en paralelo.

  • Concurrencia: la concurrencia significa que se pueden ejecutar varios subprocesos simultáneamente durante el mismo período de tiempo.

  • Sincronización: la sincronización se refiere a coordinar la secuencia de ejecución entre múltiples subprocesos para evitar condiciones de carrera e inconsistencias de datos.

  • Asincrónico: asincrónico significa que el subproceso principal no se bloquea durante la ejecución del subproceso y el subproceso principal puede continuar realizando otras tareas.


Creación y puesta en marcha de hilos.

Hay muchas formas de crear e iniciar subprocesos en C#. A continuación, presentaremos cómo utilizar estos métodos respectivamente.

1. Utilice la clase Thread

La clase Thread es la clase básica utilizada para manejar subprocesos en C#. Al crear una instancia de la clase Thread, puede crear e iniciar un nuevo subproceso. El siguiente es un ejemplo del uso de la clase Thread para crear e iniciar un hilo:

using System;
using System.Threading;

class Program
{
    
    
    static void Main()
    {
    
    
        // 创建并启动新线程
        Thread thread = new Thread(DoWork);
        thread.Start();

        // 在主线程中执行其他任务
        for (int i = 0; i < 5; i++)
        {
    
    
            Console.WriteLine("Main Thread: " + i);
            Thread.Sleep(1000);
        }
    }

    static void DoWork()
    {
    
    
        for (int i = 0; i < 5; i++)
        {
    
    
            Console.WriteLine("Worker Thread: " + i);
            Thread.Sleep(1000);
        }
    }
}

En el ejemplo anterior, el hilo se crea e inicia creando una instancia de la clase Thread y pasando un método como parámetro. Al llamar al método Start(), el nuevo hilo comienza a ejecutar el código del método DoWork() y continúa realizando otras tareas en el hilo principal.

2. Utilice la clase ThreadPool

La clase ThreadPool es un mecanismo de grupo de subprocesos proporcionado en C#. El grupo de subprocesos puede evitar la sobrecarga de crear y destruir subprocesos con frecuencia. El siguiente es un ejemplo del uso de la clase ThreadPool para crear e iniciar un hilo:

using System;
using System.Threading;

class Program
{
    
    
    static void Main()
    {
    
    
        // 使用线程池创建并启动新线程
        ThreadPool.QueueUserWorkItem(DoWork);

        // 在主线程中执行其他任务
        for (int i = 0; i < 5; i++)
        {
    
    
            Console.WriteLine("Main Thread: " + i);
            Thread.Sleep(1000);
        }
    }

    static void DoWork(object state)
    {
    
    
        for (int i = 0; i < 5; i++)
        {
    
    
            Console.WriteLine("Worker Thread: " + i);
            Thread.Sleep(1000);
        }
    }
}

En el ejemplo anterior, al llamar al método QueueUserWorkItem() de la clase ThreadPool, el método DoWork() se coloca en el grupo de subprocesos para su ejecución. A diferencia de usar la clase Thread para crear subprocesos, ThreadPool mantiene un conjunto de subprocesos reutilizables en segundo plano, evitando el costo de crear y destruir subprocesos con frecuencia.
Insertar descripción de la imagen aquí

3. Utilice la clase de tarea

La clase Task es una clase utilizada para manejar operaciones asincrónicas en C#. Al crear una instancia de la clase Task y llamar al método Start() o Run(), puede crear e iniciar un nuevo hilo. El siguiente es un ejemplo del uso de la clase Task para crear e iniciar un hilo:

using System;
using System.Threading.Tasks;

class Program
{
    
    
    static void Main()
    {
    
    
        // 创建并启动新线程
        Task task = new Task(DoWork);
        task.Start();

        // 在主线程中执行其他任务
        for (int i = 0; i < 5; i++)
        {
    
    
            Console.WriteLine("Main Thread: " + i);
            Task.Delay(1000).Wait();
        }
    }

    static void DoWork()
    {
    
    
        for (int i = 0; i < 5; i++)
        {
    
    
            Console.WriteLine("Worker Thread: " + i);
            Task.Delay(1000).Wait();
        }
    }
}

En el ejemplo anterior, el hilo se crea e inicia creando una instancia de la clase Task y pasando un método como parámetro. Al llamar al método Start(), el nuevo hilo comienza a ejecutar el código del método DoWork() y continúa realizando otras tareas en el hilo principal.
Insertar descripción de la imagen aquí


Sincronización y gestión de hilos.

En la programación de subprocesos múltiples, dado que varios subprocesos acceden a recursos compartidos al mismo tiempo pueden causar condiciones de carrera e inconsistencias en los datos, se debe utilizar un mecanismo de sincronización de subprocesos para garantizar la coordinación correcta entre múltiples subprocesos. Los siguientes son varios métodos de sincronización de subprocesos de uso común:

  • Utilice la palabra clave de bloqueo: bloquee el código de la clave que utiliza recursos compartidos para garantizar que solo un subproceso pueda acceder a los recursos compartidos.

  • Utilice la clase Monitor: utilice los métodos Enter() y Exit() de la clase Monitor para definir la sección crítica en el bloque de código para garantizar que solo un subproceso pueda ingresar a la sección crítica.

  • Utilice la clase Mutex: utilice los métodos WaitOne() y ReleaseMutex() de la clase Mutex para definir el bloqueo mutex en el bloque de código para garantizar que solo un subproceso pueda adquirir el bloqueo mutex.

  • Utilice la clase AutoResetEvent y la clase ManualResetEvent: utilice los métodos WaitOne() y Set() de estas clases para implementar el mecanismo de espera y notificación del subproceso.

Además, C# también proporciona algunos métodos y propiedades para administrar subprocesos, como:

  • Método join(): espera a que un hilo complete la ejecución.

  • Método Sleep(): suspende la ejecución del hilo actual.

  • Método abort(): finaliza la ejecución de un hilo.

  • Atributo IsAlive: determina si el hilo está activo.

Insertar descripción de la imagen aquí


Resumir

Este artículo presenta en detalle la definición y el uso de subprocesos en C#. Al crear e iniciar subprocesos, podemos implementar la ejecución paralela y operaciones asincrónicas del programa, y ​​utilizar la sincronización de subprocesos para garantizar la coordinación correcta entre múltiples subprocesos. Además, C# también proporciona algunos métodos y propiedades para administrar subprocesos para ayudarnos a controlar y administrar mejor la ejecución de subprocesos.

Supongo que te gusta

Origin blog.csdn.net/qq_22120623/article/details/135099297
Recomendado
Clasificación