如何使用异步和多线程

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

海里海西米·賓·奧馬

這些條款 異步多執行緒 操作經常令人困惑。 兩種方法都旨在通過優化系統資源使用和減少運行時間來提高程序性能和效率。然而,它們在方法、機制和預期用例上有所不同。 IronBarcode 支持這兩種方法。 本文探討了它們之間的差異以及如何使用IronBarcode來實現它們。


開始使用 IronBarcode

立即在您的專案中使用IronBarcode,並享受免費試用。

第一步:
green arrow pointer

異步讀取條形碼示例

讓我們開始了解什麼是異步讀取以及它如何對用戶有益。 異步讀取允許長時間或阻塞操作繼續進行,而不會阻塞主線程的執行。 在 C# 中,使用者可以利用 asyncawait 關鍵字與支持異步功能的方法一起使用。 這不會創建額外的執行緒,而是釋放當前執行緒。 主執行緒仍然必須啟動和管理任務,但不需要專門用於單一任務。 當異步方法需要其參與時,主線程被召喚,當不需要時,它可以釋放來處理其他任務—例如 I/O 綁定任務,如讀取/寫入文件或進行網絡請求。

讓我們以條碼讀取為例。 在這種情況下,所涉及的步驟將是:

  • 讀取檔案
  • 應用閱讀選項
  • 解碼條碼

    在「讀取檔案」步驟中,可以釋放主任務。

    使用 ReadAsyncReadPdfAsync 方法分別用於圖像和PDF文件的條碼異步讀取。

: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
VB   C#

從上面的程式碼片段中,我們已經實例化了一個圖像路徑列表,以便由IronBarcode異步讀取。 要讀取圖像,您可以使用 BarcodeReader 類的 ReadAsync 方法。 使用者可以指定 imagePaths 以及閱讀選項。

此方法用於異步操作,也可用於讀取 PDF 文檔中的條形碼,稱為 ReadPdfAsync,屬於同一類別。

在多執行緒中讀取條碼的示例

與異步操作不同,多線程允許單一進程同時在多個線程中執行。 這意味著多線程不是在單一線程中按順序執行一個過程,而是將任務分配到多個線程中,以實現並行執行。 然而,要讓多緒運作,機器必須擁有多個 CPU 核心,因為這些核心被用來獨立執行緒。 與異步操作類似,多線程旨在提高應用程序的性能和響應速度。

在 IronBarcode 中,通過設置 Multithreaded 屬性並使用 MaxParallelThreads 在 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
VB   C#

性能比較

現在,讓我們閱讀以下兩張圖片,並比較正常、非同步和多執行緒操作的讀取時間。

範例圖片

圖像 1
圖片2
正常讀取非同步讀取多线程读取(4 核心)
1.75 秒1.67 秒1.17 秒

從比較表中可以明顯看出,一旦實施了異步和多線程讀取,性能顯著提高。 然而,這兩種操作具有不同的目的和方法。 因此,使用者需要決定哪種方法更適合他們正在建構的應用程式。

最後,單一文件上可能會出現多個條碼的情況。 有關更多資訊,請訪問讀取多個條碼指南。

Hairil related to 範例圖片

海里海西米·賓·奧馬

軟體工程師

和所有優秀的工程師一樣,Hairil 是一位熱衷學習的人。他正在精進自己對 C#、Python 和 Java 的知識,利用這些知識為 Iron Software 團隊的成員創造價值。Hairil 從馬來西亞的馬來西亞工藝大學加入了 Iron Software 團隊,他在那裡獲得了化學和過程工程學士學位。