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 a menudo confunden 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 asincrónica y multiproceso

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.

  1. Instala IronBarcode con el Administrador 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

    Comienza a usar 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?

La lectura asincrónica permite que las operaciones largas o bloqueantes se realicen sin bloquear la ejecución del hilo principal. En C#, use las palabras clave async y await con métodos que admiten características asincrónicas. 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 asincrónicamente 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 instancia un List de rutas de imágenes para ser leídas asincrónicamente por IronBarcode. Para leer las imágenes, use 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 asincrónica también está disponible para leer 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.

Multithreaded
MaxParallelThreads

¿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. Bloqueos muertos: Evite Result o Wait() en métodos asincrónicos en contextos de interfaz de usuario. Siempre use await a lo largo de 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: Considere el uso de ConfigureAwait(false) cuando no necesite regresar 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, habilite el multihilo configurando la propiedad Multithreaded y especificando el máximo de núcleos para ejecución concurrente usando MaxParallelThreads en BarcodeReaderOptions. El valor predeterminado de MaxParallelThreads es 4, ajustable según los núcleos de CPU disponibles. Para obtener configuraciones de rendimiento óptimas, consulte nuestra guía de opciones de velocidad de lectura.

Por favor notaPara encontrar núcleos: Administrador de tareas -> Rendimiento -> Clic en CPU. El campo 'Cores' muestra el conteo.

: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 con el número 0 123456 789012 para demostración de lectura de código de barras multihilo
Muestra de código de barras UPC-A con el número 771234567003 para demostración de lectura de código de barras multihilo
Lectura normal Lectura asincrónica Lectura multiproceso (4 núcleos)
01,75 segundos 01,67 segundos 01,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 dependientes del CPU: El procesamiento involucra cálculos intensivos como filtros de imágenes complejos o imágenes de alta resolución
  2. Procesamiento por lotes: Se requiere el procesamiento simultáneo de múltiples imágenes independientes
  3. Sistemas multicore: El entorno de implementación tiene múltiples núcleos de CPU disponibles
  4. Crítico para el rendimiento: La velocidad de procesamiento en bruto supera la eficiencia de recursos

Elija operaciones asíncronas cuando:

  1. Operaciones dependientes del I/O: La mayor parte del tiempo implica la lectura de archivos o la espera de respuestas de red
  2. Aplicaciones de interfaz de usuario: Mantener interfaces de usuario responsivas 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 `` como línea base
  2. Tipo de carga de trabajo: Para la lectura pura de códigos de barras, use el 75 % de los núcleos disponibles
  3. Recursos del sistema: Deje espacio para el sistema operativo y otros procesos
  4. Resultados de pruebas: Realice benchmarks 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);
$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.

¿Cuáles son los beneficios de usar IronBarcode para operaciones de códigos de barras?

IronBarcode ofrece beneficios como facilidad de integración, soporte para numerosos formatos de códigos de barras, generación de imágenes de alta calidad, y capacidades robustas de lectura, convirtiéndolo en una herramienta integral para operaciones de códigos de barras en C#.

¿IronBarcode proporciona soporte para personalizar la apariencia de los códigos de barras?

Sí, IronBarcode proporciona amplias opciones de personalización para la apariencia de los códigos de barras, incluidas color, tamaño y anotaciones de texto, permitiéndote adaptar los códigos de barras a tus requisitos de diseño específicos.

¿Cómo puede IronBarcode ayudar a mejorar la eficiencia de los procesos de negocio?

IronBarcode mejora la eficiencia de los procesos de negocio al permitir la generación y lectura rápida y precisa de códigos de barras, reduciendo errores de entrada de datos manuales y mejorando el seguimiento de inventario y activos.

¿Qué habilidades de programación se necesitan para implementar IronBarcode en un proyecto?

El conocimiento básico de programación en C# es suficiente para implementar IronBarcode en un proyecto, ya que proporciona métodos sencillos y documentación completa para guiar a los desarrolladores.

¿Es IronBarcode adecuado para tanto proyectos pequeños como aplicaciones empresariales grandes?

IronBarcode está diseñado para ser escalable y versátil, haciéndolo adecuado para proyectos pequeños, así como para aplicaciones empresariales grandes que requieren soluciones robustas de códigos de barras.

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,240,258 | Versión: 2026.5 just released
Still Scrolling Icon

¿Aún desplazándote?

¿Quieres una prueba rápida? PM > Install-Package BarCode
ejecuta una muestra observa cómo tu cadena se convierte en un código de barras.