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

如何在 C# 中使用IronBarcode實現非同步和多線程

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

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

開發人員經常混淆 AsyncMultithreading 操作。 這兩種方法都能透過優化系統資源利用率和縮短運行時間來提升程式效能和效率。然而,它們在實現方式、機制和應用場景方面有所不同。 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# 中,對於支援非同步功能的方法,請使用 asyncawait 關鍵字。 這種方法不會創建額外的線程,而是釋放當前線程。 雖然主執行緒負責啟動和管理任務,但它並不會一直專注於單一任務。 當非同步方法需要主執行緒參與時,主執行緒會返回,從而在不需要時可以處理其他任務——這對於 I/O 密集型任務(如讀取/寫入檔案或發出網路請求)尤其有用。

以條碼讀取為例。 過程包括:

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

文件讀取期間,可以釋放主任務。 這有利於處理多個圖像檔案或大型 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());
}
$vbLabelText   $csharpLabel

上面的程式碼片段實例化了一個圖像路徑列表,供IronBarcode非同步讀取。 若要讀取映像,請使用 ReadAsync 類別中的 BarcodeReader 方法。 指定 imagePaths 和讀取選項。 有關進階配置選項,請參閱我們的條碼閱讀器設定指南。

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

何時應該使用非同步讀取而不是常規方法?

非同步閱讀在以下幾種情況下表現出色:

  1. GUI 應用程式:需要 UI 回應的 Windows Forms 或 WPF 應用程式。 非同步功能可防止條碼掃描期間介面卡頓。

  2. Web 應用程式: ASP.NET應用程式處理多個並發請求而不阻塞線程,尤其是在處理上傳的條碼圖像時。

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

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

為什麼非同步讀取能夠提高應用程式的反應速度?

非同步讀取透過在 I/O 密集型操作期間釋放主執行緒來提高回應速度。 當IronBarcode從磁碟讀取影像檔案或處理 PDF 時,線程不會等待空閒。 相反,它負責處理其他任務,例如回應使用者輸入或處理請求。 在處理以下情況時,這一點尤其明顯:

  • 大型圖片檔案需要較長的載入時間
  • 包含條碼的多頁PDF文件
  • 網路為基礎的影像來源
  • 需要在條碼偵測前使用影像校正濾鏡的場景

使用非同步條碼讀取時常見的陷阱有哪些?

在實現非同步條碼讀取時,請注意以下常見問題:

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

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

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

4.性能誤區:非同步操作並不能加速單一操作; 它提高了應用程式的響應速度。 為了提高處理多張圖片的速度,可以考慮多執行緒處理。

如需排查非同步相關問題,請參閱我們的條碼識別故障排除指南

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

與非同步操作不同,多執行緒可以同時在多個執行緒上執行單一進程。 多執行緒技術不是在單一執行緒中順序執行,而是將任務分配到多個執行緒中並發執行。 多執行緒需要多個 CPU 核心,因為這些核心可以獨立執行緒。 與非同步操作類似,多執行緒可以提高應用程式的效能和回應速度。

在IronBarcode中,透過設定 Multithreaded 屬性來啟用多線程,並在 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());
}
$vbLabelText   $csharpLabel

我可以期待多少效能提升?

讓我們讀取兩張範例影像,並比較普通操作、非同步操作和多執行緒操作的讀取時間。

範例影像

UPC-A 條碼範例,顯示編號 0 123456 789012,用於多執行緒條碼讀取演示
UPC-A 條碼範例,顯示編號 771234567003,用於多執行緒條碼讀取演示
正常閱讀 非同步讀取 多線程讀取(4 核)
1.75秒 1.67秒 1.17秒

對比結果顯示,非同步讀取和多執行緒讀取顯著提高了效能。 多執行緒比普通讀取效能提高了約 33%,而非同步讀取效能提高了約 5%。 然而,這些操作的目的和方法各不相同。 選擇最符合您應用需求的方法。

性能提升因以下因素而異:

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

如果單一文件上有多個條碼,請存取"讀取多個條碼"指南。

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

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

  1. CPU密集型操作:處理過程涉及大量計算,例如複雜的影像濾波器或高解析度影像。
    2.批量處理:多個獨立的影像需要同時處理
    3.多核心系統:部署環境具有多個可用的 CPU 核心。
    4.效能至關重要:原始處理速度比資源效率更重要

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

  1. I/O 密集型操作:大部分時間用於讀取檔案或等待網路回應
    2.使用者介面應用:保持響應式使用者介面至關重要
    3.資源有限:在 CPU 核心數有限的系統上運行
  2. 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

對於生產環境,監控效能並根據實際使用模式進行調整。 對於需要最高效能的企業部署,請考慮實施許可證金鑰配置

有關完整的 API 功能,請參閱IronBarcode API 參考文件

常見問題解答

讀取 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,121,847 | 版本: 2026.3 剛剛發布
Still Scrolling Icon

還在捲動嗎?

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