Cómo usar asincronicidad y multithreading en códigos de barras usando C#

Cómo utilizar Async y Multithread en C## con IronBarcode

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

Async y multithreading en IronBarcode optimizan el rendimiento de la lectura de códigos de barras de forma diferente: async evita el bloqueo del hilo principal durante las operaciones de E/S, mientras que multithreading procesa varios códigos de barras simultáneamente en todos los núcleos de la CPU.

Los desarrolladores suelen confundir las operaciones Async y Multithreading. Ambos métodos mejoran 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. IronBarcode admite ambos enfoques. Este artículo explora sus diferencias y su implementación mediante IronBarcode.

Inicio rápido: Ejemplo de lectura de código de barras asíncrona y multihilo

Use este ejemplo de una línea para comenzar instantáneamente con IronBarcode. Muestra lo fácil que es combinar las opciones de lectura asincrónica y multihilo para escanear múltiples imágenes de código de barras en paralelo con una configuración mínima.

Nuget IconEmpieza a crear PDF con NuGet ahora:

  1. Instalar IronBarcode con el gestor de paquetes NuGet

    PM > Install-Package BarCode

  2. Copie y ejecute este fragmento de código.

    var results = await IronBarCode.BarcodeReader.ReadAsync(imagePaths, new IronBarCode.BarcodeReaderOptions { Multithreaded = true, MaxParallelThreads = 4, ExpectMultipleBarcodes = true });
  3. Despliegue para probar en su entorno real

    Empieza a utilizar IronBarcode en tu proyecto hoy mismo con una prueba gratuita
    arrow pointer


¿Cómo leer códigos de barras de forma asíncrona con IronBarcode?

<Descripción: Diagrama o captura de pantalla que ilustre el concepto de código -->

La lectura asincrónica permite que las operaciones largas o bloqueantes se realicen sin bloquear la ejecución del hilo principal. En C#, utilice las palabras clave async y await con métodos que admitan funciones asíncronas. Este enfoque no crea hilos adicionales, sino que libera el hilo actual. Aunque el hilo principal inicia y gestiona tareas, no se dedica exclusivamente a una sola tarea. El hilo principal regresa cuando el método asíncrono requiere su participación, liberándolo para manejar otras tareas cuando no es necesario, particularmente útil para tareas de E/S como leer/escribir archivos o hacer peticiones de red.

Tomemos como ejemplo la lectura de códigos de barras. El proceso involucra:

  • Leer el archivo
  • Aplicar opciones de lectura
  • Decodificar el código de barras

Durante la lectura del archivo, se puede liberar la tarea principal. Esto beneficia a los escenarios con múltiples archivos de imagen o PDF de gran tamaño, como se demuestra en nuestro tutorial de lectura de códigos de barras.

Utilice los métodos ReadAsync y ReadPdfAsync para leer códigos de barras de forma asíncrona para imágenes y documentos PDF, respectivamente. Antes de implementar las operaciones asíncronas, asegúrese de haber instalado IronBarcode a través de NuGet en su proyecto.

: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;

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

Private imagePaths As New List(Of String)() From {"image1.png", "image2.png"}

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

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

' Print the results to console
For Each result In asyncResult
	Console.WriteLine(result.ToString())
Next result
$vbLabelText   $csharpLabel

El fragmento de código anterior crea una lista de rutas de imágenes que IronBarcode leerá de forma asíncrona. Para leer las imágenes, utilice el método ReadAsync de la clase BarcodeReader. Especifique el imagePaths y las opciones de lectura. Para opciones de configuración avanzadas, consulte nuestra guía sobre configuración del lector de códigos de barras.

Este método de operación asíncrona también está disponible para la lectura de códigos de barras en documentos PDF a través de ReadPdfAsync en la misma clase. Para configuraciones específicas de lectura de PDF, consulte nuestra Guía de configuración del lector de códigos de barras PDF.

¿Cuándo debo usar la lectura asíncrona en lugar de métodos regulares?

La lectura asíncrona destaca en varios escenarios:

  1. AplicacionesGUI: Aplicaciones Windows Forms o WPF que requieran capacidad de respuesta de la interfaz de usuario. Async evita la congelación de la interfaz durante el escaneado de códigos de barras.

  2. Aplicaciones web: Aplicaciones ASP.NET que manejan múltiples peticiones concurrentes sin bloquear hilos, especialmente al procesar imágenes de códigos de barras cargadas.

  3. Procesamiento por lotes: lectura secuencial de múltiples imágenes de códigos de barras o archivos PDF, lo que permite ejecutar otras tareas durante las operaciones de E/S.

  4. Operaciones de red: Lectura de códigos de barras desde fuentes remotas o URL, como se muestra en nuestro ejemplo de lectura de códigos de barras desde URL de forma asíncrona.

¿Por qué la lectura asíncrona mejora la capacidad de respuesta de las aplicaciones?

La lectura asíncrona mejora la capacidad de respuesta al liberar el hilo principal durante las operaciones de E/S. Cuando IronBarcode lee un archivo de imagen del disco o procesa un PDF, el hilo no espera inactivo. En cambio, se encarga de otras tareas como responder a las entradas de los usuarios o procesar solicitudes. Esto es especialmente notable cuando se trata de:

  • Archivos de imagen de gran tamaño que requieren un tiempo de carga considerable
  • PDF con varias páginas que contienen códigos de barras
  • Fuentes de imágenes en red
  • Escenarios que requieren filtros de corrección de imágenes antes de la detección de códigos de barras

¿Cuáles son los errores más comunes al utilizar la lectura asíncrona de códigos de barras?

Al implementar la lectura asíncrona de códigos de barras, tenga cuidado con estos problemas comunes:

  1. Deadlocks: Evita Resultado o Esperar() en métodos asíncronos en contextos de interfaz de usuario. Utilice siempre await en toda la cadena de llamadas.

  2. Manejo de excepciones: Envuelve las llamadas async en bloques try-catch ya que las excepciones en métodos async pueden no propagarse como se espera.

  3. Cambio de contexto: Considera el uso de ConfigureAwait(false) cuando no necesites volver al contexto de sincronización original.

  4. Inconcepciones erróneas sobre el rendimiento: Async no acelera las operaciones individuales; mejora la capacidad de respuesta de las aplicaciones. Para mejorar la velocidad con varias imágenes, considere el multithreading.

Para solucionar problemas relacionados con async, consulte nuestra guía de solución de problemas de reconocimiento de códigos de barras.

¿Cómo habilito la lectura multihilo de códigos de barras?

A diferencia de las operaciones asíncronas, el multithreading ejecuta un único proceso a través de múltiples hilos simultáneamente. En lugar de la ejecución secuencial en un único hilo, el multithreading divide las tareas entre varios hilos para la ejecución concurrente. El multithreading requiere varios núcleos de CPU, ya que estos núcleos ejecutan hilos de forma independiente. Al igual que las operaciones asíncronas, el multithreading mejora el rendimiento y la capacidad de respuesta de las aplicaciones.

En IronBarcode, active el multihilo estableciendo la propiedad Multithreaded y especificando el número máximo de núcleos para la ejecución concurrente mediante MaxParallelThreads en BarcodeReaderOptions. El valor por defecto de MaxParallelThreads es 4, ajustable en función de los núcleos de CPU disponibles. Para obtener configuraciones de rendimiento óptimas, consulte nuestra guía de opciones de velocidad de lectura.

[{i:(Para encontrar núcleos disponibles: Administrador de tareas -> Pestaña Rendimiento -> Haga clic en CPU. El campo 'Núcleos' muestra el recuento.@@--CIERRE DE SOPORTE--@@

: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
$vbLabelText   $csharpLabel

¿Qué mejora del rendimiento puedo esperar?

Leamos dos imágenes de ejemplo y comparemos los tiempos de lectura en operaciones normales, asíncronas y multihilo.

Imagen de muestra

Ejemplo de código de barras UPC-A que muestra el número 0 123456 789012 para la demostración de lectura de código de barras multihilo
Muestra de código de barras UPC-A que muestra el número 771234567003 para la demostración de lectura de código de barras multihilo
Lectura normalLectura asincrónicaLectura multiproceso (4 núcleos)
01,75 segundos01,67 segundos01,17 segundos

La comparación muestra un aumento significativo del rendimiento con la lectura asíncrona y multihilo. Multithreading proporciona aproximadamente un 33% de mejora con respecto a la lectura normal, mientras que async ofrece alrededor de un 5% de mejora. Sin embargo, estas operaciones tienen propósitos y enfoques diferentes. Elija el enfoque que mejor se adapte a los requisitos de su aplicación.

Las mejoras de rendimiento varían en función de:

  • Número de imágenes procesadas
  • Complejidad de la imagen y calidad del código de barras
  • Núcleos de CPU disponibles
  • Otros recursos del sistema

Para situaciones con varios BarCodes en un mismo documento, visite la guía Lectura de varios BarCodes.

¿Cuándo debería elegir multihilo en lugar de operaciones asíncronas?

Elija multithreading cuando:

  1. Operaciones ligadas a la CPU: El procesamiento implica computación pesada como filtros de imagen complejos o imágenes de alta resolución
  2. Procesamiento por lotes: Múltiples imágenes independientes requieren un procesamiento simultáneo
  3. Sistemas multinúcleo: El entorno de despliegue dispone de varios núcleos de CPU
  4. Rendimiento crítico: La velocidad de procesamiento en bruto pesa más que la eficiencia de los recursos

Elija operaciones asíncronas cuando:

  1. Operaciones de entrada/salida: La mayor parte del tiempo implica leer archivos o esperar respuestas de la red
  2. Aplicaciones de interfaz de usuario: Mantener interfaces de usuario con capacidad de respuesta es crucial
  3. Recursos limitados: Ejecución en sistemas con núcleos de CPU limitados
  4. Aplicaciones Web: Gestión eficiente de múltiples peticiones simultáneas

¿Cómo puedo determinar el valor óptimo de MaxParallelThreads?

El valor óptimo de MaxParallelThreads depende de varios factores:

  1. Núcleos de CPU disponibles: Comience con Environment.ProcessorCount como línea de base
  2. Tipo de carga de trabajo: Para la lectura pura de códigos de barras, utiliza el 75% de los núcleos disponibles
  3. Recursos del sistema: Dejar espacio libre para el sistema operativo y otros procesos
  4. Resultados de las pruebas: Comparación con su carga de trabajo específica

He aquí un enfoque práctico para encontrar el valor óptimo:

int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Para entornos de producción, supervise el rendimiento y ajústelo en función de los patrones de uso reales. Considere la posibilidad de implementar configuración de claves de licencia para implantaciones empresariales que requieran el máximo rendimiento.

Para conocer todas las funciones de la API, consulte IronBarcode API Reference.

Preguntas Frecuentes

¿Cuál es la diferencia entre async y multithreading en la lectura de códigos de barras?

Con IronBarcode, las operaciones asíncronas evitan el bloqueo del subproceso principal durante las tareas de E/S, como la lectura de archivos, mientras que los subprocesos múltiples procesan varios códigos de barras simultáneamente a través de los núcleos de la CPU. Async utiliza las palabras clave async/await para liberar el hilo principal durante operaciones largas, mientras que multithreading crea varios hilos para gestionar el procesamiento de códigos de barras en paralelo.

¿Cómo implemento la lectura asíncrona de códigos de barras en C#?

IronBarcode proporciona los métodos ReadAsync() y ReadPdfAsync() para la lectura asíncrona de códigos de barras. Simplemente utilice estos métodos con las palabras clave async/await en C# para leer códigos de barras de imágenes y PDFs sin bloquear el hilo principal. Esto es particularmente beneficioso cuando se procesan múltiples archivos de imagen o grandes documentos PDF.

¿Cómo puedo activar el multithreading para el procesamiento de códigos de barras?

Para habilitar el multiproceso en IronBarcode, establezca la propiedad Multithreaded en 'true' en BarcodeReaderOptions. También puede controlar el número de subprocesos paralelos mediante la propiedad MaxParallelThreads, lo que le permite optimizar el rendimiento en función de las capacidades de su sistema.

¿Puedo combinar async y multithreading para obtener un rendimiento óptimo?

Sí, IronBarcode le permite combinar ambos enfoques. Puede utilizar ReadAsync() con multithreading habilitado estableciendo Multithreaded = true y configurando MaxParallelThreads en BarcodeReaderOptions. Esta combinación proporciona tanto operaciones de E/S no bloqueantes como procesamiento paralelo en varios núcleos de CPU.

¿Cuándo debo utilizar async frente a multithreading para la lectura de códigos de barras?

Utilice operaciones asíncronas en IronBarcode cuando se trate de tareas de E/S como la lectura de archivos de gran tamaño o la realización de solicitudes de red, ya que evita la congelación de la interfaz de usuario. Utilice multithreading cuando necesite procesar varios códigos de barras simultáneamente y disponga de recursos de CPU. Para obtener los mejores resultados, combine ambos enfoques cuando procese varias imágenes de códigos de barras o archivos PDF de gran tamaño.

Hairil Hasyimi Bin Omar
Ingeniero de Software
Como todos los grandes ingenieros, Hairil es un ávido aprendiz. Está refinando su conocimiento de C#, Python y Java, usando ese conocimiento para agregar valor a los miembros del equipo en Iron Software. Hairil se unió al equipo de Iron Software desde la Universiti Teknologi MARA en Malasia, donde se ...
Leer más
¿Listo para empezar?
Nuget Descargas 2,002,059 | Versión: 2025.12 recién lanzado