Cómo utilizar Async y Multithread

This article was translated from English: Does it need improvement?
Translated
View the article in English

por Hairil Hasyimi Bin Omar

Las condiciones Async y Multihilo operaciones se confunden a menudo. Ambos métodos pretenden mejorar el rendimiento y la eficiencia de los programas optimizando la utilización de los recursos del sistema y reduciendo el tiempo de ejecución. Sin embargo, difieren en el enfoque, los mecanismos y los casos de uso previstos. IronBarcode admite ambos enfoques. Este artículo explora las diferencias entre ellos y cómo implementarlos utilizando IronBarcode.


Biblioteca NuGet C# para

Instalar con NuGet

Install-Package BarCode
o
Java PDF JAR

Descargar DLL

Descargar DLL

Instalar manualmente en su proyecto

Biblioteca NuGet C# para

Instalar con NuGet

Install-Package BarCode
o
Java PDF JAR

Descargar DLL

Descargar DLL

Instalar manualmente en su proyecto

Comience a usar IronPDF en su proyecto hoy con una prueba gratuita.

Primer Paso:
green arrow pointer

Echa un vistazo IronBarcode en Nuget para una instalación y despliegue rápidos. Con más de 8 millones de descargas, está transformando con C#.

Biblioteca NuGet C# para nuget.org/packages/BarCode/
Install-Package BarCode

Considere instalar el IronBarcode DLL directamente. Descárguelo e instálelo manualmente para su proyecto o forma GAC: IronBarCode.zip

Instalar manualmente en su proyecto

Descargar DLL

Ejemplo de lectura asíncrona de códigos de barras

Empecemos por entender qué es la lectura asíncrona y en qué beneficia a los usuarios. La lectura asíncrona permite realizar operaciones largas o bloqueantes sin bloquear la ejecución del hilo principal. En C#, los usuarios pueden utilizar las palabras clave async y await con métodos que admiten funciones asíncronas. Esto no creará hilos adicionales, sino que liberará el hilo actual. Aunque el hilo principal sigue siendo necesario para iniciar y gestionar tareas, no es necesario que se dedique exclusivamente a una sola tarea. El hilo principal es invocado cuando el método asíncrono requiere su participación, liberándolo para manejar otras tareas cuando no es necesario, tales como tareas de E/S como la lectura/escritura de archivos o hacer peticiones de red.

Tomemos como ejemplo la lectura de códigos de barras. En este caso, los pasos serían:

  • Lectura del fichero
  • Aplicar las opciones de lectura
  • Descodificación del código de barras

    Durante el paso "Lectura del fichero", se puede liberar la tarea principal.

    Utilice los métodos ReadAsync y ReadPdfAsync para leer códigos de barras de forma asíncrona para imágenes y documentos PDF, respectivamente.

:path=/static-assets/barcode/content-code-examples/how-to/async-multithread-async.cs
using IronBarCode;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
#endregion
public class async_multithread_async
{
    public async Task codeAsync()
    {
        List<string> imagePaths = new List<string>() { "image1.png", "image2.png" };

        // Barcode reading options
        BarcodeReaderOptions options = new BarcodeReaderOptions()
        {
            ExpectMultipleBarcodes = true
        };

        // Read barcode using Async
        BarcodeResults asyncResult = await BarcodeReader.ReadAsync(imagePaths, options);

        // Print the results to console
        foreach (var result in asyncResult)
        {
            Console.WriteLine(result.ToString());
        }
    
Imports IronBarCode
Imports System
Imports System.Collections.Generic
Imports System.Threading.Tasks

#End Region
Public Class async_multithread_async
	Public Async Function codeAsync() As Task
		Dim imagePaths As New List(Of String)() From {"image1.png", "image2.png"}

		' Barcode reading options
		Dim options As New BarcodeReaderOptions() With {.ExpectMultipleBarcodes = True}

		' Read barcode using Async
		Dim asyncResult As BarcodeResults = Await BarcodeReader.ReadAsync(imagePaths, options)

		' Print the results to console
		For Each result In asyncResult
			Console.WriteLine(result.ToString())
		Next result
VB   C#

A partir del fragmento de código anterior, hemos instanciado una Lista de rutas de imágenes que IronBarcode leerá de forma asíncrona. Para leer las imágenes, puede utilizar el método ReadAsync de la clase BarcodeReader. A continuación, los usuarios pueden especificar las rutas de las imágenes, así como las opciones de lectura.

Este método para operaciones asíncronas también está disponible para leer códigos de barras en documentos PDF, conocido como ReadPdfAsync, que forma parte de la misma clase.

Ejemplo de lectura de códigos de barras en multihilo

A diferencia de las operaciones asíncronas, el multithreading permite ejecutar un único proceso en varios hilos simultáneamente. Esto significa que en lugar de ejecutar un proceso secuencialmente en un único hilo, el multithreading divide las tareas entre varios hilos, lo que permite la ejecución concurrente. Sin embargo, para que el multihilo funcione, una máquina debe tener varios núcleos de CPU, ya que estos núcleos se utilizan para ejecutar los hilos de forma independiente. Al igual que las operaciones asíncronas, el multithreading pretende mejorar el rendimiento y la capacidad de respuesta de las aplicaciones.

En IronBarcode, active el multithreading estableciendo la propiedad Multithreaded y especificando el máximo de núcleos para la ejecución concurrente mediante MaxParallelThreads en BarcodeReaderOptions. El valor por defecto para MaxParallelThreads es 4, que puede ajustarse en función de los núcleos de CPU disponibles.

Atención
Para encontrar los núcleos disponibles Administrador de tareas -> pestaña Rendimiento -> Haga clic en CPU. El campo "Núcleos" muestra el recuento.

:path=/static-assets/barcode/content-code-examples/how-to/async-multithread-multithread.cs
using IronBarCode;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;

List<string> imagePaths = new List<string>(){"test1.jpg", "test2.png"};

// Barcode reading options
BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    Multithreaded = true,
    MaxParallelThreads = 4,
    ExpectMultipleBarcodes = true
};

// Read barcode with multithreaded enabled
BarcodeResults results = BarcodeReader.Read(imagePaths, options);

// Print the results to console
foreach (var result in results)
{
    Console.WriteLine(result.ToString());
}
Imports IronBarCode
Imports System
Imports System.Collections.Generic
Imports System.Threading.Tasks

Private imagePaths As New List(Of String)() From {"test1.jpg", "test2.png"}

' Barcode reading options
Private options As New BarcodeReaderOptions() With {
	.Multithreaded = True,
	.MaxParallelThreads = 4,
	.ExpectMultipleBarcodes = True
}

' Read barcode with multithreaded enabled
Private results As BarcodeResults = BarcodeReader.Read(imagePaths, options)

' Print the results to console
For Each result In results
	Console.WriteLine(result.ToString())
Next result
VB   C#

Comparación de resultados

Ahora, leamos las dos imágenes de abajo y comparemos el tiempo de lectura de las operaciones normales, asíncronas y multihilo.

Imagen de muestra

Imagen 1
Imagen 2
Lectura normalLectura asíncronaLectura multihilo (4 núcleos)
01,75 segundos01,67 segundos01.17 segundo

De la tabla comparativa se desprende que hay un aumento significativo del rendimiento una vez que se implementa la lectura asíncrona y multihilo. Sin embargo, estas dos operaciones responden a objetivos y planteamientos diferentes. Por lo tanto, los usuarios deben determinar qué enfoque se adapta mejor a la aplicación que están creando.

Por último, puede haber situaciones en las que haya varios códigos de barras en un mismo documento. Para más información, visite Leer varios códigos de barras guía.

Hairil Hasyimi Bin Omar

Ingeniero de software

Como todos los grandes ingenieros, Hairil es un ávido aprendiz. Está perfeccionando sus conocimientos de C#, Python y Java, y los utiliza para añadir valor a los miembros del equipo de Iron Software. Hairil se unió al equipo de Iron Software desde la Universiti Teknologi MARA de Malasia, donde se licenció en Ingeniería Química y de Procesos.