Cómo utilizar Async y Multithread

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

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" };

        //  Opciones de lectura de códigos de barras
        BarcodeReaderOptions options = new BarcodeReaderOptions()
        {
            ExpectMultipleBarcodes = true
        };

        //  Leer código de barras usando Async
        BarcodeResults asyncResult = await BarcodeReader.ReadAsync(imagePaths, options);

        //  Imprimir los resultados en la consola
        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"}

		'  Opciones de lectura de códigos de barras
		Dim options As New BarcodeReaderOptions() With {.ExpectMultipleBarcodes = True}

		'  Leer código de barras usando Async
		Dim asyncResult As BarcodeResults = Await BarcodeReader.ReadAsync(imagePaths, options)

		'  Imprimir los resultados en la consola
		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.

Tenga en cuenta
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"};

//  Opciones de lectura de códigos de barras
BarcodeReaderOptions options = new BarcodeReaderOptions()
{
    Multithreaded = true,
    MaxParallelThreads = 4,
    ExpectMultipleBarcodes = true
};

//  Leer código de barras con multihilo activado
BarcodeResults results = BarcodeReader.Read(imagePaths, options);

//  Imprimir los resultados en la consola
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"}

'  Opciones de lectura de códigos de barras
Private options As New BarcodeReaderOptions() With {
	.Multithreaded = True,
	.MaxParallelThreads = 4,
	.ExpectMultipleBarcodes = True
}

'  Leer código de barras con multihilo activado
Private results As BarcodeResults = BarcodeReader.Read(imagePaths, options)

'  Imprimir los resultados en la consola
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.