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

如何使用 IronBarcode 在 C# 中使用 Async 和多執行緒。

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

IronBarcode中的Async和多執行緒以不同的方式優化條碼讀取性能 - async防止在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 異步讀取條碼?

<! -- Diagram illustrating read barcodes asynchronously example implementation --> <!--說明:說明程式碼概念的圖表或截圖 -->

非同步讀取允許長時間或阻塞性操作在不阻塞主執行緒執行的情況下進行。 在 C# 中,使用 asyncawait 關鍵字與支援異步功能的方法。 此方法不會建立額外的線程,而是釋放目前的線程。 主線程會啟動和管理任務,但不會只專注於單一任務。 當異步方法需要主線程參與時,主線程會返回,讓主線程在不需要時可以處理其他任務,這對讀/寫檔案或進行網路請求等 I/O 綁定任務特別有用。

以 BarCode 讀取為例。 過程包括

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

在閱讀檔案的過程中,主要任務可以釋放。 這有利於多個影像檔案或大型 PDF 的使用情境,正如我們的 讀取 BarCode 教程 所示。

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

此異步操作方法也可透過相同類別中的 ReadPdfAsync 讀取 PDF 文件中的條碼。 有關特定的 PDF 閱讀設定,請參閱我們的 PDF BarCode 閱讀器設定指南

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

異步閱讀在幾種情況下表現優異:

1.GUI 應用程式:需要 UI 反應能力的 Windows 窗體或 WPF 應用程式。 Async 可防止條碼掃描時介面凍結。

2.Web 應用程式:在不阻塞線程的情況下處理多個並發請求的 ASP.NET 應用程式,尤其是在處理上傳的 BarCode 影像時。

3.批次處理:循序讀取多個條碼影像或 PDF,允許在 I/O 作業期間執行其他任務。

4.網路作業:從遠端來源或 URL 讀取 BarCode,如我們的 異步從 URL 讀取條碼範例所示。

為什麼 Async 讀取可以改善應用程式的反應能力?

異步讀取透過在 I/O 綁定作業期間釋放主線程來改善反應速度。 當 IronBarcode 從磁碟讀取影像檔案或處理 PDF 時,線程不會空閒等待。 而不是處理其他工作,例如回應使用者輸入或處理請求。 這一點在處理以下項目時尤其明顯:

  • 需要大量載入時間的大型圖檔
  • 包含 BarCode 的多頁 PDF 檔案
  • 基於網路的影像來源
  • 需要在條碼偵測前使用 影像修正篩選器的場景

使用 Async BarCode 讀取時有哪些常見陷阱?

在實施 async BarCode 讀取時,請注意這些常見問題:

1.僵局:避免在 UI 上下文中的 async 方法上使用 ResultWait() 。 在整個呼叫鏈中始終要使用 await

2.異常處理:將異步呼叫包覆在 try-catch 區塊中,因為異步方法中的異常可能無法如預期般傳播。

3.情境切換:當您不需要返回原始同步上下文時,請考慮 ConfigureAwait(false) 的用法。

4.效能誤解:Async 並不會加速個別作業; 可提高應用程式的反應能力。 若要提高多張圖片的速度,請考慮使用多執行緒。

有關 async 相關問題的疑難排解,請參閱我們的 BarCode 識別疑難排解指南

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

與非同步操作不同,多執行緒會同時在多個線程上執行單一程序。 多執行緒(multithreading)並非在單一線程中順序執行,而是將任務分給多個線程同時執行。 多執行緒需要多個 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% 的改善,而 async 則提供約 5% 的改善。 然而,這些作業的目的和方式各不相同。 選擇最適合您應用需求的方式。

效能改善依下列因素而異:

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

針對單一文件上有多個 BarCode 的情況,請造訪 讀取多個條碼指南。

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

選擇多執行緒時:

1.CPU-Bound 運作:處理過程涉及繁重的運算,例如複雜的影像濾鏡或高解析度影像 2.批次處理:需要同時處理多個獨立的影像 3.多核心系統:部署環境有多個可用的 CPU 核心 4.效能關鍵:原始處理速度大於資源效率

在下列情況下選擇非同步作業

1.I/O-Bound 作業:大部分時間涉及讀取檔案或等待網路回應 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

對於生產環境,請監控效能,並根據實際使用模式進行調整。 對於需要最高效能的企業部署,請考慮實施 license key configuration

如需完整的 API 功能,請參閱 IronBarcode API Reference

常見問題解答

讀取 BarCode 時,async 與多執行緒有何差異?

使用 IronBarcode,Async 操作可防止在 I/O 任務(如文件讀取)期間阻塞主線程,而多執行緒可跨 CPU 核心同時處理多個條碼。Async 使用 async/await 關鍵字在長時間的操作中釋放主線程,而多執行緒則創建多個線程來並行處理條碼。

如何在 C# 中實現異步 BarCode 讀取?

IronBarcode 提供 ReadAsync() 和 ReadPdfAsync() 方法用於異步條碼讀取。只需在 C# 中使用這些帶有 async/await 關鍵字的方法,即可從圖片和 PDF 中讀取條碼,而不會阻塞主線程。這在處理多個影像檔案或大型 PDF 文件時特別有利。

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

要在 IronBarcode 中啟用多執行緒,請在 BarcodeReaderOptions 中設定 Multithreaded 屬性為 'true'。您也可以使用 MaxParallelThreads 属性控制并行线程的数量,允许您根据系统的能力优化性能。

我可以結合 async 和多執行緒以獲得最佳效能嗎?

是的,IronBarcode 允許您結合這兩種方法。您可以通過在 BarcodeReaderOptions 中設置 Multithreaded = true 和配置 MaxParallelThreads 來使用 ReadAsync() 並啟用多執行緒。此組合可提供非阻塞 I/O 操作以及跨多個 CPU 核心的平行處理。

在讀取 BarCode 時,何時應該使用 async vs 多執行緒?

在 IronBarcode 中,當處理 I/O 綁定的任務(例如讀取大型檔案或進行網路請求)時,請使用 async 作業,因為它可以防止使用者介面凍結。當您需要同時處理多個 BarCode 並且有可用的 CPU 資源時,請使用多執行緒。為達到最佳效果,在處理多個大型條碼影像或 PDF 時,請結合兩種方法。

Hairil Hasyimi Bin Omar
軟體工程師
就像所有優秀的工程師一樣,Hairil 也是一位狂熱的學習者。他不斷精進 C#、Python 和 Java 的知識,利用這些知識為整個 Iron Software 的團隊成員增加價值。Hairil 從馬來西亞的 Universiti Teknologi MARA 大學加入 Iron Software 團隊,畢業於該校的化學與流程工程學系,並取得學士學位。
準備好開始了嗎?
Nuget 下載 2,070,733 | 版本: 2026.2 剛剛發布