如何使用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。 它展示了如何轻松结合异步读取和多线程选项,以最少的设置平行扫描多个条码图像。

Nuget Icon立即开始使用 NuGet 创建 PDF 文件:

  1. 使用 NuGet 包管理器安装 IronBarcode

    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 文档的条形码。 在实施异步操作之前,请确保您已经通过 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

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

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

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

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

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 块中,因为异步方法中的异常可能无法按预期传播。

3.上下文切换:当您不需要返回到原始同步上下文时,请考虑使用 ConfigureAwait(false)

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

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

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

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

在 IronBarcode 中,通过设置 Multithreaded 属性启用多线程,并在 BarcodeReaderOptions 中使用 MaxParallelThreads 指定并发执行的最大内核。 默认 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 运算:处理涉及繁重的计算,如复杂的图像过滤器或高分辨率图像 2.批量处理:需要同时处理多个独立图像 3.多核系统:部署环境有多个可用的 CPU 内核 4.性能关键:原始处理速度高于资源效率

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

1.输入/输出绑定操作:大部分时间涉及读取文件或等待网络响应 2.用户界面应用程序:保持反应灵敏的用户界面至关重要 3.资源有限:在 CPU 内核有限的系统上运行 4.网络应用:高效处理多个并发请求

如何确定最佳 MaxParallelThreads 值?

最佳 MaxParallelThreads 值取决于多个因素:

1.可用 CPU 内核:以 Environment.ProcessorCount 为基准开始。 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 时,可将两种方法结合使用。

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