非同期とマルチスレッドの使用方法

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

によって ハイリル ハシミ ビン オマル

用語 非同期 そして マルチスレッド 操作はよく混同されます。 両方の方法は、システムリソースの利用を最適化し、実行時間を短縮することで、プログラムのパフォーマンスと効率を向上させることを目的としています。 しかし、それらはアプローチ、メカニズム、および意図された使用ケースが異なります。 IronBarcodeは両方のアプローチをサポートしています。 この記事ではそれらの違いとIronBarcodeを使用した実装方法について探ります。


 用 C# NuGet ライブラリ

でインストール NuGet

Install-Package BarCode
または
Java PDF JAR(ジャバPDF JAR)

ダウンロード DLL (ディーエルエル)

DLLをダウンロード

プロジェクトに手動でインストールする

 用 C# NuGet ライブラリ

でインストール NuGet

Install-Package BarCode
または
Java PDF JAR(ジャバPDF JAR)

ダウンロード DLL (ディーエルエル)

DLLをダウンロード

プロジェクトに手動でインストールする

今日からプロジェクトでIronPDFを使い始めましょう。無料のトライアルをお試しください。

最初のステップ:
green arrow pointer

チェックアウト IronBarcode オン Nuget 迅速なインストールと展開のために。8百万以上のダウンロード数により、をC#で変革しています。

 用 C# NuGet ライブラリ nuget.org/packages/BarCode/
Install-Package BarCode

インストールを検討してください IronBarcode DLL 直接。ダウンロードして、プロジェクトまたはGACの形式で手動でインストールしてください。 IronBarCode.zip

プロジェクトに手動でインストールする

DLLをダウンロード

バーコードを非同期で読み取る例

それでは、非同期読み取りとは何か、その利点について理解していきましょう。 非同期読み取りにより、長時間またはブロッキング操作がメインスレッドの実行をブロックすることなく進行することができます。 C#では、ユーザーはasyncおよびawaitキーワードを使用して、非同期機能をサポートするメソッドを利用できます。 これは追加のスレッドを作成せず、代わりに現在のスレッドを解放します。 主スレッドはタスクを開始および管理するために依然として必要ですが、単一のタスクのみに専念する必要はありません。 メインスレッドは、非同期メソッドがその関与を必要とするときに呼び出され、不要な場合は他のタスクを処理するために解放されます。これは、ファイルの読み書きやネットワークリクエストの実行などの I/O に依存するタスクに適用されます。

例としてバーコードの読み取りを考えてみましょう。 このシナリオでは、関与するステップは次の通りです:

  • ファイルを読み込んでいます
  • 読取オプションの適用

  • バーコードをデコードする

    「ファイルの読み込み」ステップでは、主要なタスクが解放されます。

    ReadAsync メソッドと ReadPdfAsync メソッドを使用して、画像と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;

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
#endregion
public class async_multithread_async
{
    public async Task codeAsync()
    {
        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

#End Region
Public Class async_multithread_async
	Public Async Function codeAsync() As Task
		Dim imagePaths As New List(Of String)() From {"image1.png", "image2.png"}

		' Barcode reading options
		Dim options As New BarcodeReaderOptions() With {.ExpectMultipleBarcodes = True}

		' Read barcode using Async
		Dim 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や読み取りオプションを指定することができます。

この非同期操作の方法は、同じクラスの一部である ReadPdfAsync として知られるPDFドキュメント内のバーコードを読み取るためにも利用できます。

マルチスレッドの例でバーコードを読み取る

非同期操作と異なり、マルチスレッドは単一のプロセスを複数のスレッドで同時に実行することができます。 これは、プロセスを単一スレッドで逐次実行する代わりに、マルチスレッディングがタスクを複数のスレッドに分割し、並行実行を可能にすることを意味します。 ただし、マルチスレッドを機能させるためには、機械に複数のCPUコアが必要です。これらのコアはスレッドを独立して実行するために使用されます。 非同期操作と同様に、マルチスレッド処理はアプリケーションのパフォーマンスと応答性を向上させることを目的としています。

IronBarcodeでは、Multithreaded プロパティを設定し、BarcodeReaderOptionsの MaxParallelThreads を使用して同時実行のための最大コア数を指定することにより、マルチスレッドを有効にします。 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#

パフォーマンス比較

さて、以下の2つの画像を読み取り、通常、非同期、およびマルチスレッド操作の読み取り時間を比較しましょう。

サンプル画像

画像 1
画像2
ノーマルリード 非同期読み取り マルチスレッド読み取り(4コア)
01.75秒 01.67秒 01.17秒

比較表から、非同期およびマルチスレッド読み込みを実装するとパフォーマンスが大幅に向上することが明らかです。 しかし、これらの2つの操作は異なる目的とアプローチを提供します。 したがって、ユーザーは自分が構築しているアプリケーションに最適なアプローチを決定する必要があります。

最後に、1つのドキュメントに複数のバーコードが存在する場合もあります。 詳細については、次のサイトをご覧ください。 複数バーコードの読み取り ガイド

ハイリル ハシミ ビン オマル

ソフトウェアエンジニア

すべての優れたエンジニアと同じように、Hairilは熱心な学習者です。C#、Python、およびJavaの知識を洗練させ、その知識を活かしてIron Softwareのチームメンバーに価値を提供しています。Hairilはマレーシアのマラ工科大学(Universiti Teknologi MARA)で化学およびプロセス工学の学士号を取得し、Iron Softwareチームに加わりました。