非同期とマルチスレッドの使用方法
用語 非同期 そして マルチスレッド 操作はよく混同されます。 両方の方法は、システムリソースの利用を最適化し、実行時間を短縮することで、プログラムのパフォーマンスと効率を向上させることを目的としています。 しかし、それらはアプローチ、メカニズム、および意図された使用ケースが異なります。 IronBarcodeは両方のアプローチをサポートしています。 この記事ではそれらの違いとIronBarcodeを使用した実装方法について探ります。
非同期とマルチスレッドの使用方法
IronBarcodeを始める
今日から無料トライアルでIronBarcodeをあなたのプロジェクトで使い始めましょう。
バーコードを非同期で読み取る例
それでは、非同期読み取りとは何か、その利点について理解していきましょう。 非同期読み取りにより、長時間またはブロッキング操作がメインスレッドの実行をブロックすることなく進行することができます。 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;
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
上記のコードスニペットから、IronBarcodeによって非同期に読み取られる画像パスのリストをインスタンス化しました。 画像を読み取るには、BarcodeReaderクラスのReadAsync
メソッドを使用できます。 ユーザーは、imagePathsや読み取りオプションを指定することができます。
この非同期操作の方法は、同じクラスの一部である ReadPdfAsync
として知られるPDFドキュメント内のバーコードを読み取るためにも利用できます。
マルチスレッドの例でバーコードを読み取る
非同期操作と異なり、マルチスレッドは単一のプロセスを複数のスレッドで同時に実行することができます。 これは、プロセスを単一スレッドで逐次実行する代わりに、マルチスレッディングがタスクを複数のスレッドに分割し、並行実行を可能にすることを意味します。 ただし、マルチスレッドを機能させるためには、機械に複数の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
パフォーマンス比較
さて、以下の2つの画像を読み取り、通常、非同期、およびマルチスレッド操作の読み取り時間を比較しましょう。
サンプル画像
ノーマルリード | 非同期読み取り | マルチスレッド読み取り(4コア) |
---|---|---|
1.75秒 | 1.67秒 | 1.17秒 |
比較表から、非同期およびマルチスレッド読み込みを実装するとパフォーマンスが大幅に向上することが明らかです。 しかし、これらの2つの操作は異なる目的とアプローチを提供します。 したがって、ユーザーは自分が構築しているアプリケーションに最適なアプローチを決定する必要があります。
最後に、1つのドキュメントに複数のバーコードが存在する場合もあります。 詳細については、次のサイトをご覧ください。複数バーコードの読み取りガイド