如何在條碼中使用非同步和多執行緒進行C#程式設計

如何在 C# 中使用 IronBarcode 實現非同步與多執行緒

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

IronBarcode 中的非同步與多執行緒技術,透過不同方式優化 BARCODE 讀取效能——非同步技術可避免 I/O 操作期間阻塞主執行緒,而多執行緒技術則能透過 CPU 核心同時處理多個 BARCODE。

開發人員常將 AsyncMultithreading 操作混淆。 這兩種方法皆透過優化系統資源利用率及縮短執行時間,來提升程式效能與效率。然而,它們在方法、機制及應用情境上有所不同。 IronBarcode 同時支援這兩種方法。 本文將探討它們之間的差異,並介紹如何使用 IronBarcode 進行實作。

快速入門:非同步與多執行緒BarCode讀取範例

使用這段單行範例,立即開始使用 IronBarcode。 這展示了如何輕鬆結合非同步讀取與多執行緒選項,僅需最少的設定即可並行掃描多個BarCode影像。

  1. using 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 異步讀取 BARCODE?

非同步讀取可讓長程或阻塞性操作在不阻塞主執行緒的情況下進行。 在 C# 中,請針對支援非同步功能的方法使用 asyncawait 關鍵字。 此方法不會建立額外的執行緒,而是釋放當前的執行緒。 雖然主執行緒負責啟動並管理任務,但它並非專注於單一任務。 當非同步方法需要主執行緒介入時,主執行緒會返回;當不需要時,則釋放主執行緒以處理其他任務——這對於讀寫檔案或發送網路請求等 I/O 綁定任務特別有用。

以BarCode讀取為例。 流程包含:

  • 讀取檔案
  • 套用閱讀選項
  • 解碼BarCode

在讀取檔案期間,主任務可被釋放。 這對於處理多個圖像檔案或大型 PDF 的情境特別有用,如我們的"讀取 BARCODE"教學中所示範。

請分別使用 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 及閱讀選項。 如需進階設定選項,請參閱我們的BarCode讀取器設定指南。

此非同步操作方法亦可用於透過同一類別中的 ReadPdfAsync 讀取 PDF 文件中的 BarCode。 有關 PDF 讀取的具體設定,請參閱我們的 PDF 條碼讀取器設定指南

Multithreaded
MaxParallelThreads

何時應使用非同步讀取而非一般方法?

非同步讀取在以下幾種情境中表現尤為出色:

  1. GUI 應用程式:需要使用者介面反應速度的 Windows Forms 或 WPF 應用程式。 Async 可防止在掃描 BarCode 時介面凍結。

  2. 網頁應用程式:能夠在不阻塞執行緒的情況下處理多個並發請求的 ASP.NET 應用程式,特別是在處理上傳的 BarCode 影像時。

  3. 批次處理:依序讀取多個 BarCode 影像或 PDF 檔案,並允許在 I/O 操作期間執行其他任務。

  4. 網路操作:從遠端來源或 URL 讀取 BARCODE,如我們的"從 URL 異步讀取 BARCODE"範例所示。

為什麼非同步讀取能提升應用程式的響應速度?

非同步讀取可在 I/O 密集型操作期間釋放主執行緒,從而提升系統反應速度。 當 IronBarcode 從磁碟讀取影像檔案或處理 PDF 時,執行緒不會處於空閒等待狀態。 相反地,它負責處理其他任務,例如回應使用者輸入或處理請求。 這在處理以下情況時尤為重要:

  • 大型圖像檔案,載入時間較長
  • 包含 BarCode 的多頁 PDF 檔案
  • 基於網路的圖像來源
  • 需在BarCode偵測前套用影像校正濾鏡的情境

使用非同步BarCode讀取時常見哪些陷阱?

在實作非同步BarCode讀取時,請留意以下常見問題:

  1. 死鎖:請避免在 UI 情境中的非同步方法上出現 ResultWait()。 在整個呼叫鏈中,請始終使用 await

  2. 例外處理:請將非同步呼叫封裝在 try-catch 區塊中,因為非同步方法中的例外可能不會如預期般傳遞。

  3. 上下文切換:當您無需返回原始同步上下文時,請考慮使用 ConfigureAwait(false)

  4. 效能誤解:Async 並不會加速個別操作; 它能提升應用程式的反應速度。 若需提升處理多張圖片的速度,請考慮採用多執行緒技術。

若需排除與非同步相關的問題,請參閱我們的BarCode辨識疑難排解指南

如何啟用多執行緒BarCode讀取功能?

與非同步操作不同,多執行緒是在多個執行緒上同時執行單一程序。 與單一執行緒的順序執行不同,多執行緒會將任務分配給多個執行緒,以進行並行執行。 多執行緒需要多個 CPU 核心,因為這些核心會獨立執行各執行緒。 如同非同步操作,多執行緒技術能提升應用程式的效能與反應速度。

在 IronBarcode 中,請透過設定 Multithreaded 屬性來啟用多執行緒,並在 BarcodeReaderOptions 中使用 MaxParallelThreads 指定同時執行的最大核心數。 預設的 MaxParallelThreads 值為 4,可根據可用 CPU 核心數進行調整。 如需最佳效能設定,請參閱我們的閱讀速度選項指南

請注意要查看可用核心數:工作管理員 -> 效能標籤 -> 點擊 CPU。 'Cores' 欄位顯示計數。)}]

: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 BARCODE範例,顯示數字 0 123456 789012,用於多執行緒BARCODE讀取示範
UPC-A BARCODE 範例,顯示編號 771234567003,用於多執行緒 BARCODE 讀取示範
一般閱讀 非同步讀取 多執行緒讀取 (4 核心)
01.75 秒 01.67 秒 01.17 秒

比較結果顯示,採用非同步及多執行緒讀取方式可顯著提升效能。 多執行緒可比一般讀取提升約 33% 的效能,而非同步處理則可提升約 5%。 然而,這些操作具有不同的目的與方法。 請選擇最符合您應用需求的方法。

效能提升程度取決於:

  • 已處理的圖片數量
  • 圖像複雜度與BarCode品質
  • 可用 CPU 核心
  • 其他系統資源

若單一文件中包含多個BarCode,請參閱《讀取多個BarCode》指南。

何時應選擇多執行緒而非非同步操作?

在以下情況下選擇多執行緒:

  1. CPU 密集型運算:處理過程涉及大量運算,例如複雜的影像濾鏡或高解析度影像
  2. 批次處理:需同時處理多張獨立圖片
  3. 多核心系統:部署環境中具備多個 CPU 核心
  4. 效能關鍵:原始處理速度比資源效率更為重要

在以下情況下應選擇非同步操作:

  1. I/O 綁定操作:大部分時間用於讀取檔案或等待網路回應
  2. 使用者介面應用程式:維持響應式使用者介面至關重要
  3. 資源受限:在 CPU 核心數有限的系統上運行
  4. 網路應用程式:高效處理多個並發請求

如何確定最佳的 MaxParallelThreads 值?

最佳的 MaxParallelThreads 值取決於以下幾個因素:

  1. 可用 CPU 核心數:以 `` 作為基準值
  2. 工作負載類型:若僅進行純 BarCode 讀取,請使用 75% 的可用核心
  3. 系統資源:為作業系統及其他程序預留空間
  4. 測試結果:針對您的特定工作負載進行效能比較

以下是一種找出最佳解的實用方法:

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

在生產環境中,請監控效能並根據實際使用模式進行調整。 建議針對需要極致效能的Enterprise部署,實作授權金鑰配置功能

如需完整的 API 功能,請參閱 IronBarcode API 參考手冊。

常見問題

條碼讀取時,非同步與多執行緒有何不同?

在IronBarcode中,非同步操作能防止在進行檔案讀取等I/O任務時阻塞主執行緒,而多執行緒能同時跨CPU核心處理多個條碼。非同步使用async/await關鍵字在長時間操作時釋放主執行緒,而多執行緒創建多個執行緒,平行處理條碼。

如何在C#中實現非同步條碼讀取?

IronBarcode提供ReadAsync()和ReadPdfAsync()方法,用於非同步條碼讀取。在C#中使用這些方法與async/await關鍵字,從影像和PDF中讀取條碼而不阻塞主執行緒。這在處理多個影像檔案或大型PDF文檔時尤其有用。

如何啟用條碼處理的多執行緒?

要在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 從馬來西亞馬拉科技大學(Universiti Teknologi MARA)加入 Iron Software 團隊,他在該校取得化學與製程工程學士學位。
準備好開始了嗎?
Nuget 下載 2,240,258 | 版本: 2026.5 just released
Still Scrolling Icon

還在捲動嗎?

想要快速證明? PM > Install-Package BarCode
執行範例 看您的字串變成 BarCode。