非同期とマルチスレッドの使用方法
Async と Multithreading の操作はしばしば混同されます。 両方の方法は、システムリソースの利用を最適化し、実行時間を短縮することで、プログラムのパフォーマンスと効率を向上させることを目的としています。 しかし、それらはアプローチ、メカニズム、および意図された使用ケースが異なります。 IronBarcodeは両方のアプローチをサポートしています。 この記事ではそれらの違いとIronBarcodeを使用した実装方法について探ります。
非同期とマルチスレッドの使用方法
IronBarcodeを始める
今日から無料トライアルでIronBarcodeをあなたのプロジェクトで使い始めましょう。
バーコードを非同期で読み取る例
それでは、非同期読み取りとは何か、その利点について理解していきましょう。 非同期読み取りにより、長時間またはブロッキング操作がメインスレッドの実行をブロックすることなく進行することができます。 C#では、ユーザーは非同期機能をサポートするメソッドでasyncおよびawaitキーワードを利用できます。 これは追加のスレッドを作成せず、代わりに現在のスレッドを解放します。 主スレッドはタスクを開始および管理するために依然として必要ですが、単一のタスクのみに専念する必要はありません。 メインスレッドは、非同期メソッドがその関与を必要とするときに呼び出され、不要な場合は他のタスクを処理するために解放されます。これは、ファイルの読み書きやネットワークリクエストの実行などの I/O に依存するタスクに適用されます。
例としてバーコードの読み取りを考えてみましょう。 このシナリオでは、関与するステップは次の通りです:
- ファイルを読み込んでいます
- 読取オプションの適用
-
バーコードをデコードする
「ファイルの読み込み」ステップでは、主要なタスクが解放されます。
画像およびPDFドキュメントからバーコードを非同期で読み取るために、それぞれ
ReadAsync
およびReadPdfAsync
メソッドを使用します。
: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コアに基づいて調整することができます。
[{i:(利用可能なコアを見つけるには、タスクマネージャー -> パフォーマンスタブ -> 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
パフォーマンス比較
さて、以下の2つの画像を読み取り、通常、非同期、およびマルチスレッド操作の読み取り時間を比較しましょう。
サンプル画像


Normal Read | Asynchronous Read | Multithreaded Read (4 cores) |
---|---|---|
01.75 second | 01.67 second | 01.17 second |
比較表から、非同期およびマルチスレッド読み込みを実装するとパフォーマンスが大幅に向上することが明らかです。 しかし、これらの2つの操作は異なる目的とアプローチを提供します。 したがって、ユーザーは自分が構築しているアプリケーションに最適なアプローチを決定する必要があります。
最後に、1つのドキュメントに複数のバーコードが存在する場合もあります。 詳細については、複数のバーコードを読み取るガイドをご覧ください。