如何在條碼上使用C#的非同步及多執行緒

如何在C#中使用IronBarcode進行非同步和多執行緒操作

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

IronBarcode中的非同步和多執行緒優化條碼讀取性能的方式不同 - 非同步防止在I/O操作期間阻塞主執行緒,而多執行緒則在各個CPU核心上同時處理多個條碼。

開發者經常混淆Multithreading操作。 這兩種方法透過優化系統資源利用率和降低運行時間來提升程式的性能和效率。然而,它們的方式、機制和使用案例不同。 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#中,使用支援非同步特性的await關鍵字。 這種方式不會建立額外的執行緒,而是釋放當前的執行緒。 雖然主執行緒啟動和管理任務,但它並不專用於單一任務。 當非同步方法需要主執行緒的參與時,主執行緒返回,使其在不需要時可以處理其他任務——尤其對於I/O限制的任務如讀寫文件或發起網路請求非常有用。

以條碼讀取為例。 這一過程涉及:

  • 讀取文件
  • 應用讀取選項
  • 解碼條碼

在文件讀取期間,主任務可以被釋放。 這對於有多個圖像文件或大型PDF的情境有益,如我們在條碼讀取教程中所示範。

使用ReadPdfAsync方法分別讀取圖像和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

上面的程式碼片段會初始化一個List,以便IronBarcode非同步讀取圖像路徑。 要讀取圖像,可以使用BarcodeReader類。 指定imagePaths和讀取選項。 如需進階的配置選項,請參閱我們的條碼讀取器設置指南

這種非同步操作方法也可以用於通過同一類的ReadPdfAsync在PDF文件中讀取條碼。 如需特定的PDF讀取配置,請參閱我們的PDF條碼讀取器設置指南

Multithreaded
MaxParallelThreads

什麼時候應該選擇非同步讀取而非常規方法?

非同步讀取在多種情況下表現出色:

  1. GUI應用程式:需要UI反應速度的Windows Forms或WPF應用程式。 非同步可防止在條碼掃描期間介面凍結。

  2. Web應用程式:ASP.NET應用程式在不阻塞執行緒的情況下處理多個併發請求,特別是在處理上傳的條碼圖像時。

  3. 批次處理:多個條碼圖像或PDF的序列讀取,允許其它任務在I/O操作期間執行。

  4. 網路操作:從遠端資源或URL讀取條碼,如我們的非同步範例從URL讀取條碼

為什麼非同步讀取能提高應用程式的響應能力?

非同步讀取透過在I/O約束操作期間釋放主執行緒來提高響應能力。 當IronBarcode從磁碟讀取圖像文件或處理PDF時,執行緒不會保持空閒。 相反,它會處理其他任務,如回應使用者輸入或處理請求。 這在以下情況特別明顯:

  • 需要顯著載入時間的大型圖像文件
  • 含有多個條碼的多頁面PDF
  • 基於網路的圖像來源
  • 在條碼檢測前需要圖像校正濾鏡的情境

使用非同步條碼讀取的常見陷阱是什麼?

實施非同步條碼讀取時,需注意以下常見問題:

  1. 死鎖:在UI上下文中避免對非同步方法的Wait()。 始終在呼叫鏈中使用await

  2. 異常處理:將非同步調用包在try-catch塊中,因為在非同步方法中的異常可能不會按預期傳播。

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

  4. 性能誤解:非同步不能加快單個操作; 它提高應用程式的響應能力。 對於多個圖像的速度提升,考慮使用多執行緒。

有關非同步相關問題的疑難排解,請參閱我們的條碼識別疑難排解指南

如何啟用多執行緒條碼讀取?

與非同步操作不同,多執行緒能同時在多個執行緒上執行單個進程。 而不是在單個執行緒中順序執行,多執行緒將任務分配給多個執行緒以同時執行。 多執行緒需要多個CPU核心,因為這些核心獨立執行執行緒。 與非同步操作類似,多執行緒提高了應用程式的性能和響應能力。

在IronBarcode中,通過設置BarcodeReaderOptions中指定並行執行的最大核心數。 預設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條碼範例顯示數字0 123456 789012,用於多執行緒條碼讀取演示
UPC-A條碼範例顯示數字771234567003,用於多執行緒條碼讀取演示
普通讀取 非同步讀取 多執行緒讀取(4核心)
01.75秒 01.67秒 01.17秒

比較顯示,非同步和多執行緒讀取帶來了顯著的性能提升。 多執行緒比普通讀取提高了大約33%,而非同步則提高了約5%。 然而,這些操作服務於不同的目的和方法。 選擇最適合您應用程式需求的方法。

性能提升取決於:

  • 處理的圖像數量
  • 圖像的複雜性和條碼質量
  • 可用的CPU核心
  • 其他系統資源

如在單個文件上存在多個條碼,查看讀取多個條碼指南。

什麼時候應該選擇多執行緒而非非同步操作?

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

  1. CPU密集型運算:處理涉及複雜運算,如複雜圖像濾鏡或高解析度圖像
  2. 批次處理:多個獨立圖像需要同時處理
  3. 多核心系統:部署環境提供多個可用的CPU核心
  4. 性能至關重要:原始處理速度超出資源效率

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

  1. I/O限制操作:大部分時間涉及讀取文件或等待網路回應
  2. UI應用程式:維持響應式使用者介面至為重要
  3. 資源有限:在有限CPU核心的系統上運行
  4. Web應用程式:高效處理多個併發請求

我如何確定最佳的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

對於生產環境,監控性能並根據實際使用模式進行調整。 考慮對需要最大性能的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允許您結合兩種方法。您可以使用ReadAsync()並設定Multithreaded = true以啟用多執行緒,並在BarcodeReaderOptions中配置MaxParallelThreads。此組合提供非阻塞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,331,688 | 版本: 2026.7 剛剛發布
Still Scrolling Icon

還在滾動嗎?

想快速驗證嗎? PM > Install-Package BarCode
運行範例觀看您的字串成為條碼。