如何使用C#在条形码中使用异步和多线程

如何使用 IronBarcode 在 C# 中使用异步和多线程

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

IronBarcode 中的异步和多线程以不同方式优化条码读取性能--异步可防止在 I/O 操作期间阻塞主线程,而多线程可跨 CPU 内核同时处理多个条码。

开发者常将 AsyncMultithreading 操作混淆。 这两种方法都能通过优化系统资源利用率和缩短运行时间来提高程序性能和效率。不过,它们在方法、机制和用例上有所不同。 IronBarcode支持这两种方法。 本文将探讨它们的区别以及使用 IronBarcode 的实现方式。

快速入门:异步和多线程条码读取示例

使用这个单行示例即可立即开始使用IronBarcode。 它展示了如何轻松结合异步读取和多线程选项,以最少的设置平行扫描多个条码图像。

  1. 使用 NuGet 包管理器安装 https://www.nuget.org/packages/BarCode

    PM > Install-Package BarCode
  2. 复制并运行这段代码。

    var results = await IronBarCode.BarcodeReader.ReadAsync(imagePaths, new IronBarCode.BarcodeReaderOptions { Multithreaded = true, MaxParallelThreads = 4, ExpectMultipleBarcodes = true });
  3. 部署到您的生产环境中进行测试

    通过免费试用立即在您的项目中开始使用IronBarcode

    arrow pointer


如何使用 IronBarcode 异步读取条码?

异步读取使长期或阻塞操作能够进行而不会阻塞主线程的执行。 在 C# 中,请在支持异步功能的方法中使用 asyncawait 关键字。 这种方法不会创建额外的线程,而是释放当前线程。 虽然主线程会启动和管理任务,但它不会只专注于一项任务。 当异步方法需要主线程参与时,主线程会返回,从而在不需要时将其释放出来处理其他任务--这对于读/写文件或进行网络请求等 I/O 绑定任务尤其有用。

以条形码阅读为例。 该过程包括:

  • 读取文件
  • 应用读取选项
  • 解码条码

在文件阅读过程中,可以放开主要任务。 正如我们的阅读 BarCode 教程所展示的那样,这对使用多个图像文件或大型 PDF 文件的场景大有裨益。

使用 ReadAsyncReadPdfAsync 方法分别对图像和 PDF 文档进行异步 BarCode 读取。 在实施异步操作之前,请确保您已经通过 NuGet 在您的项目中安装了 IronBarcode。

: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

上面的代码片段实例化了一个 List 的图像路径数组,供 IronBarcode 异步读取。 要读取图像,请使用 BarcodeReader 类中的 ReadAsync 方法。 请指定 imagePaths 及阅读选项。 有关高级配置选项,请参阅我们的条码阅读器设置指南。

该异步操作方法也可用于通过同一类中的 ReadPdfAsync 读取 PDF 文档中的 BarCode。 有关具体的 PDF 阅读配置,请参阅我们的 PDF 条码阅读器设置指南

Multithreaded
MaxParallelThreads

什么情况下应使用异步阅读而不是常规方法?

异步阅读在以下几种情况下表现出色:

1.GUI 应用程序:需要用户界面响应能力的 Windows 窗体或 WPF 应用程序。 Async 可防止在扫描 BarCode 时界面冻结。

2.网络应用:在不阻塞线程的情况下处理多个并发请求的 ASP.NET 应用程序,尤其是在处理上传的条形码图像时。

3.批处理:顺序读取多个条形码图像或 PDF,允许在 I/O 操作期间执行其他任务。

4.网络操作:从远程源或 URL 读取条形码,如我们的 异步从 URL 读取条形码示例所示。

为什么异步阅读可以提高应用程序的响应速度?

异步读取可在 I/O 绑定操作期间释放主线程,从而提高响应速度。 当 IronBarcode 从磁盘读取图像文件或处理 PDF 时,线程不会空闲等待。 在翻译过程中,译员不能只处理用户输入或处理请求等其他任务。 这一点在涉及以下内容时尤为明显

  • 需要大量加载时间的大型图像文件
  • 多页包含 BarCode 的 PDF 文件
  • 基于网络的图像源
  • 需要在检测条形码前使用 图像校正过滤器的场景

使用异步条码读取时有哪些常见误区?

在实施异步条形码读取时,请注意这些常见问题:

  1. 死锁:在 UI 上下文中,应避免在异步方法中出现 ResultWait()。 在整个调用链中,请始终使用 await

2.异常处理:将异步调用包在 try-catch 块中,因为异步方法中的异常可能无法按预期传播。

  1. 上下文切换:当无需返回原始同步上下文时,请考虑使用 ConfigureAwait(false)

4.性能误解:异步不会加速单个操作; 它提高了应用程序的响应速度。 为提高多图像的速度,请考虑使用多线程。

有关异步相关问题的故障排除,请查阅我们的条形码识别故障排除指南

如何启用多线程条码读取?

与异步操作不同,多线程是通过多个线程同时执行一个进程。 多线程不是在单线程中顺序执行,而是将任务分配给多个线程并发执行。 多线程需要多个 CPU 内核,因为这些内核可以独立执行线程。 与异步操作一样,多线程可提高应用程序的性能和响应速度。

在 IronBarcode 中,通过设置 Multithreaded 属性并使用 MaxParallelThreadsBarcodeReaderOptions 中指定最大并发执行核心数,即可启用多线程功能。 默认的 MaxParallelThreads 值为 4,可根据可用 CPU 核心数进行调整。 有关最佳性能配置,请参阅我们的阅读速度选项指南

请注意要查找可用核心:任务管理器 -> 性能选项卡 -> 点击 CPU。 ### 性能比较

: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

我可以期待多少性能改进?

让我们读取两幅示例图像,并比较正常、异步和多线程操作的读取时间。

示例图像

UPC-A 条形码示例,显示数字 0 123456 789012,用于多线程条形码读取演示
用于多线程条码读取演示的 UPC-A 条码样本,显示编号 771234567003
正常阅读 异步读取 多线程读取(4 核)
1.75秒 1.67秒 1.17秒

比较结果表明,异步和多线程阅读的性能大幅提高。 与正常阅读相比,多线程可提高约 33%,而异步可提高约 5%。 然而,这些操作的目的和方法各不相同。 选择最适合您的应用要求的方法。

性能改进根据以下因素而有所不同:

  • 处理的图片数量
  • 图像复杂度和 BarCode 质量
  • 可用的 CPU 内核
  • 其他系统资源

对于单个文档上有多个条形码的情况,请访问阅读多个条形码指南。

何时应选择多线程而非同步操作?

选择多线程时:

  1. CPU-Bound Operations:处理涉及复杂图像滤镜或高分辨率图像的重计算
  2. 批处理:需要同时处理多个独立的图像
  3. 多核心系统:部署环境上有多个CPU核心可用
  4. 性能至关重要:原始处理速度比资源效率更加重要

在以下情况下选择异步操作

  1. I/O-Bound Operations:大部分时间涉及读取文件或等待网络响应
  2. UI应用:维护响应的用户界面至关重要
  3. 资源有限:在CPU核心有限的系统上运行 4.网络应用:高效处理多个并发请求

如何确定最佳 MaxParallelThreads 值?

最佳的 MaxParallelThreads 值取决于以下几个因素:

  1. 可用 CPU 核心数:以 `` 为基准
  2. 工作负载类型:对纯条形码阅读,使用可用核心的75%
  3. 系统资源:为操作系统和其他进程留有缓冲
  4. 测试结果:根据您的具体工作负载进行基准测试

以下是寻找最佳值的实用方法:

int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
$vbLabelText   $csharpLabel

对于生产环境,应监控性能并根据实际使用模式进行调整。 考虑为需要最高性能的企业部署实施 许可证密钥配置

有关完整的 API 功能,请查阅 IronBarcode API Reference

常见问题解答

读取 BarCode 时,异步和多线程有什么区别?

使用 IronBarcode,异步操作可防止在文件读取等 I/O 任务期间阻塞主线程,而多线程则可跨 CPU 内核同时处理多个条形码。async使用async/await关键字在长时间操作时释放主线程,而多线程则创建多个线程并行处理条形码。

如何在 C# 中实现异步 BarCode 读取?

IronBarcode 为异步条码读取提供 ReadAsync() 和 ReadPdfAsync() 方法。只需在 C# 中使用这些带有 async/await 关键字的方法,即可在不阻塞主线程的情况下从图像和 PDF 中读取条形码。这在处理多个图像文件或大型 PDF 文档时尤其有用。

如何启用多线程处理 BarCode?

要在 IronBarcode 中启用多线程,请在 BarcodeReaderOptions 中将 Multithreaded 属性设置为 "true"。您还可以使用 MaxParallelThreads 属性来控制并行线程的数量,从而根据您的系统能力来优化性能。

我能否将异步和多线程结合起来以获得最佳性能?

是的,IronBarcode 允许您将这两种方法结合起来。通过设置 Multithreaded = true 并在 BarcodeReaderOptions 中配置 MaxParallelThreads,您可以在启用多线程的情况下使用 ReadAsync()。这种组合可提供非阻塞 I/O 操作和跨多个 CPU 内核的并行处理。

何时应在条码读取中使用异步与多线程?

在处理 I/O 绑定任务(如读取大文件或进行网络请求)时,请在 IronBarcode 中使用异步操作,因为它可以防止 UI 冻结。当您需要同时处理多个条码,并且有可用的 CPU 资源时,请使用多线程操作。为获得最佳效果,在处理多个大型条码图像或 PDF 时,可将两种方法结合使用。

在条形码操作中使用IronBarcode的好处是什么?

IronBarcode提供了易于集成、对多种条形码格式的支持、高质量的图像生成和强大的读取能力等好处,使其成为C#条形码操作的综合工具。

IronBarcode是否提供支持自定义条形码外观的功能?

是的,IronBarcode为条形码外观提供广泛的自定义选项,包括颜色、大小和文本注释,允许运您将条形码设计成符合您特定的设计要求。

IronBarcode如何帮助提高业务流程的效率?

IronBarcode通过快速准确的条码生成和读取提高了业务流程效率,减少了手动数据输入错误,并改善了库存和资产跟踪。

在项目中实现IronBarcode需要哪些编程技能?

了解C#编程的基础知识就足以在项目中实现IronBarcode,因为它提供了简单的方法和全面的文档来指导开发人员。

IronBarcode适合小项目和大型企业应用吗?

IronBarcode被设计为可扩展且多功能,适合需要强大条码解决方案的小项目和大型企业应用。

Hairil Hasyimi Bin Omar
软件工程师
如所有伟大的工程师一般,Hairil 是个热心的学习者。他正在提高对 C#、Python 和 Java 的知识,并利用这些知识为 Iron Software 团队成员增值。Hairil 从马来西亚的玛拉工业大学加入 Iron Software 团队,获得化学与工艺工程学士学位。
准备开始了吗?
Nuget 下载 2,240,258 | 版本: 2026.5 just released
Still Scrolling Icon

还在滚动吗?

想快速获得证据? PM > Install-Package BarCode
运行示例 观看您的字符串变成 BarCode。