如何在 C# 中使用 IronBarcode 實現非同步與多執行緒
IronBarcode 中的非同步與多執行緒技術,透過不同方式優化 BARCODE 讀取效能——非同步技術可避免 I/O 操作期間阻塞主執行緒,而多執行緒技術則能透過 CPU 核心同時處理多個 BARCODE。
開發人員常將 Async 與 Multithreading 操作混淆。 這兩種方法皆透過優化系統資源利用率及縮短執行時間,來提升程式效能與效率。然而,它們在方法、機制及應用情境上有所不同。 IronBarcode 同時支援這兩種方法。 本文將探討它們之間的差異,並介紹如何使用 IronBarcode 進行實作。
快速入門:非同步與多執行緒BarCode讀取範例
使用這段單行範例,立即開始使用 IronBarcode。 這展示了如何輕鬆結合非同步讀取與多執行緒選項,僅需最少的設定即可並行掃描多個BarCode影像。
-
using NuGet 套件管理員安裝 https://www.nuget.org/packages/BarCode
PM > Install-Package BarCode -
請複製並執行此程式碼片段。
var results = await IronBarCode.BarcodeReader.ReadAsync(imagePaths, new IronBarCode.BarcodeReaderOptions { Multithreaded = true, MaxParallelThreads = 4, ExpectMultipleBarcodes = true }); -
部署至您的生產環境進行測試
立即透過免費試用,在您的專案中開始使用 IronBarcode
簡化工作流程(5 個步驟)
- 下載支援非同步與多執行緒的 C# 函式庫
- 使用
ReadAsync和ReadPdfAsync方法,用於從圖片和 PDF 檔案中進行非同步 BarCode 讀取 - 將 Multithreaded 屬性設定為 'true' 以啟用多執行緒
- 使用 MaxParallelThreads 屬性指定並行執行緒數
- 查看常規、非同步及多執行緒BarCode讀取的效能比較
如何使用 IronBarcode 異步讀取 BARCODE?
非同步讀取可讓長程或阻塞性操作在不阻塞主執行緒的情況下進行。 在 C# 中,請針對支援非同步功能的方法使用 async 和 await 關鍵字。 此方法不會建立額外的執行緒,而是釋放當前的執行緒。 雖然主執行緒負責啟動並管理任務,但它並非專注於單一任務。 當非同步方法需要主執行緒介入時,主執行緒會返回;當不需要時,則釋放主執行緒以處理其他任務——這對於讀寫檔案或發送網路請求等 I/O 綁定任務特別有用。
以BarCode讀取為例。 流程包含:
- 讀取檔案
- 套用閱讀選項
- 解碼BarCode
在讀取檔案期間,主任務可被釋放。 這對於處理多個圖像檔案或大型 PDF 的情境特別有用,如我們的"讀取 BARCODE"教學中所示範。
請分別使用 ReadAsync 和 ReadPdfAsync 方法,以非同步方式讀取圖片和 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
上方的程式碼片段建立了一個 List 物件,用以存放將由 IronBarcode 異步讀取的圖片路徑。 若要讀取圖片,請使用 BarcodeReader 類別中的 ReadAsync 方法。 請指定 imagePaths 及閱讀選項。 如需進階設定選項,請參閱我們的BarCode讀取器設定指南。
此非同步操作方法亦可用於透過同一類別中的 ReadPdfAsync 讀取 PDF 文件中的 BarCode。 有關 PDF 讀取的具體設定,請參閱我們的 PDF 條碼讀取器設定指南。
Multithreaded
MaxParallelThreads
何時應使用非同步讀取而非一般方法?
非同步讀取在以下幾種情境中表現尤為出色:
-
GUI 應用程式:需要使用者介面反應速度的 Windows Forms 或 WPF 應用程式。 Async 可防止在掃描 BarCode 時介面凍結。
-
網頁應用程式:能夠在不阻塞執行緒的情況下處理多個並發請求的 ASP.NET 應用程式,特別是在處理上傳的 BarCode 影像時。
-
批次處理:依序讀取多個 BarCode 影像或 PDF 檔案,並允許在 I/O 操作期間執行其他任務。
- 網路操作:從遠端來源或 URL 讀取 BARCODE,如我們的"從 URL 異步讀取 BARCODE"範例所示。
為什麼非同步讀取能提升應用程式的響應速度?
非同步讀取可在 I/O 密集型操作期間釋放主執行緒,從而提升系統反應速度。 當 IronBarcode 從磁碟讀取影像檔案或處理 PDF 時,執行緒不會處於空閒等待狀態。 相反地,它負責處理其他任務,例如回應使用者輸入或處理請求。 這在處理以下情況時尤為重要:
- 大型圖像檔案,載入時間較長
- 包含 BarCode 的多頁 PDF 檔案
- 基於網路的圖像來源
- 需在BarCode偵測前套用影像校正濾鏡的情境
使用非同步BarCode讀取時常見哪些陷阱?
在實作非同步BarCode讀取時,請留意以下常見問題:
-
死鎖:請避免在 UI 情境中的非同步方法上出現
Result或Wait()。 在整個呼叫鏈中,請始終使用await。 -
例外處理:請將非同步呼叫封裝在 try-catch 區塊中,因為非同步方法中的例外可能不會如預期般傳遞。
-
上下文切換:當您無需返回原始同步上下文時,請考慮使用
ConfigureAwait(false)。 - 效能誤解:Async 並不會加速個別操作; 它能提升應用程式的反應速度。 若需提升處理多張圖片的速度,請考慮採用多執行緒技術。
若需排除與非同步相關的問題,請參閱我們的BarCode辨識疑難排解指南。
如何啟用多執行緒BarCode讀取功能?
與非同步操作不同,多執行緒是在多個執行緒上同時執行單一程序。 與單一執行緒的順序執行不同,多執行緒會將任務分配給多個執行緒,以進行並行執行。 多執行緒需要多個 CPU 核心,因為這些核心會獨立執行各執行緒。 如同非同步操作,多執行緒技術能提升應用程式的效能與反應速度。
在 IronBarcode 中,請透過設定 Multithreaded 屬性來啟用多執行緒,並在 BarcodeReaderOptions 中使用 MaxParallelThreads 指定同時執行的最大核心數。 預設的 MaxParallelThreads 值為 4,可根據可用 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
我可以預期性能提升多少?
讓我們讀取兩張範例圖片,並比較正常、非同步及多執行緒操作的讀取時間。
範例圖片
| 一般閱讀 | 非同步讀取 | 多執行緒讀取 (4 核心) |
|---|---|---|
| 01.75 秒 | 01.67 秒 | 01.17 秒 |
比較結果顯示,採用非同步及多執行緒讀取方式可顯著提升效能。 多執行緒可比一般讀取提升約 33% 的效能,而非同步處理則可提升約 5%。 然而,這些操作具有不同的目的與方法。 請選擇最符合您應用需求的方法。
效能提升程度取決於:
- 已處理的圖片數量
- 圖像複雜度與BarCode品質
- 可用 CPU 核心
- 其他系統資源
若單一文件中包含多個BarCode,請參閱《讀取多個BarCode》指南。
何時應選擇多執行緒而非非同步操作?
在以下情況下選擇多執行緒:
- CPU 密集型運算:處理過程涉及大量運算,例如複雜的影像濾鏡或高解析度影像
- 批次處理:需同時處理多張獨立圖片
- 多核心系統:部署環境中具備多個 CPU 核心
- 效能關鍵:原始處理速度比資源效率更為重要
在以下情況下應選擇非同步操作:
- I/O 綁定操作:大部分時間用於讀取檔案或等待網路回應
- 使用者介面應用程式:維持響應式使用者介面至關重要
- 資源受限:在 CPU 核心數有限的系統上運行
- 網路應用程式:高效處理多個並發請求
如何確定最佳的 MaxParallelThreads 值?
最佳的 MaxParallelThreads 值取決於以下幾個因素:
- 可用 CPU 核心數:以 `` 作為基準值
- 工作負載類型:若僅進行純 BarCode 讀取,請使用 75% 的可用核心
- 系統資源:為作業系統及其他程序預留空間
- 測試結果:針對您的特定工作負載進行效能比較
以下是一種找出最佳解的實用方法:
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
在生產環境中,請監控效能並根據實際使用模式進行調整。 建議針對需要極致效能的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設計為可擴展且多功能,使其適合小型專案和需要強大條碼解決方案的大型企業應用。

