C#で非同期とマルチスレッドを使う方法 with IronBarcode
IronBarcodeの非同期処理とマルチスレッド処理では、バーコード読み取り性能の最適化が異なります。非同期処理ではI/O処理中にメインスレッドがブロックされるのを防ぎ、マルチスレッド処理ではCPUコア間で複数のバーコードを同時に処理します。
開発者は、Async と Multithreading の操作を混同することがよくあります。 どちらの手法も、システムリソースの利用を最適化し、実行時間を短縮することで、プログラムのパフォーマンスと効率を高めます。しかし、アプローチ、メカニズム、使用例が異なります。 IronBarcodeは両方のアプローチをサポートしています。 この記事では、IronBarcodeを使用したそれぞれの違いや実装について説明します。
クイックスタート: 非同期 & マルチスレッド バーコード読み取りの例
このワンラインの例を使用して、即座にIronBarcodeで開始できます。 非同期読み取りとマルチスレッドオプションを組み合わせて、最小限の設定で複数のバーコード画像を並行してスキャンする方法を示しています。
-
IronBarcode をNuGetパッケージマネージャでインストール
PM > Install-Package BarCode -
このコード スニペットをコピーして実行します。
var results = await IronBarCode.BarcodeReader.ReadAsync(imagePaths, new IronBarCode.BarcodeReaderOptions { Multithreaded = true, MaxParallelThreads = 4, ExpectMultipleBarcodes = true }); -
実際の環境でテストするためにデプロイする
今日プロジェクトで IronBarcode を使い始めましょう無料トライアル
最小限のワークフロー(5ステップ)
- 非同期およびマルチスレッドをサポートするC#ライブラリをダウンロードする
- 画像や PDF から非同期にバーコードを読み取るには、 `ReadAsync`と`ReadPdfAsync`メソッドを使用します。
- **Multithreaded**プロパティを 'true' に設定してマルチスレッドを有効にします。
- **MaxParallelThreads**プロパティを使用して並列スレッド数を指定します
- 通常、非同期、マルチスレッドのバーコード読み取りのパフォーマンス比較を確認する
IronBarcodeで非同期にBarCodeを読み取るには?
非同期読み取りにより、長時間またはブロッキング操作がメインスレッドの実行をブロックせずに進行できるようになります。 C# では、非同期機能をサポートするメソッドで async および await キーワードを使用します。 このアプローチは、追加のスレッドを作成するのではなく、現在のスレッドを解放します。 メインスレッドはタスクを開始し管理しますが、1つのタスクだけに専念するわけではありません。 メインスレッドは、非同期メソッドに関与する必要があるときに戻り、不要なときに他のタスクを処理するために解放されます-ファイルの読み取り/書き込みやネットワーク要求のようなI/Oバウンドタスクに特に便利です。
バーコードの読み取りを例に考えてみましょう。 プロセスには以下が含まれます:
- ファイルの読み取り
- 読み取りオプションの適用
- バーコードのデコード
ファイル読み取り中に、メインタスクが解放されることがあります。 これは、バーコードを読むチュートリアルで示したように、複数の画像ファイルや大きなPDFを使用するシナリオに役立ちます。
画像と PDF ドキュメントのバーコードをそれぞれ非同期的に読み取りするには、ReadAsync と ReadPdfAsync メソッドを使用します。 非同期処理を実装する前に、プロジェクトに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());
}
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 と読み取りオプションを指定します。 高度な設定オプションについては、BarCodeリーダー設定のガイドを参照してください。
この非同期操作メソッドは、同じクラスの ReadPdfAsync を介して PDF ドキュメント内のバーコードを読み取る場合にも使用できます。 特定のPDF読み取り設定については、PDFバーコードリーダー設定ガイドを参照してください。
通常のメソッドよりも非同期読み取りを使用するのはいつですか?
非同期読み取りは、以下のシナリオで特に効果的です:
1.GUIアプリケーション:UI応答性を必要とするWindowsフォームまたはWPFアプリケーション。 Asyncは、バーコードスキャン中のインターフェイスのフリーズを防ぎます。
2.Webアプリケーション:ASP.NETアプリケーションは、特にアップロードされたバーコード画像を処理するときに、スレッドをブロックすることなく複数の同時リクエストを処理します。
3.バッチ処理: 複数の BarCode イメージや PDF を連続して読み取り、I/O 操作中に他のタスクを実行できるようにします。
4.ネットワーク操作:read barcodes from URL asynchronously example で示したように、リモート ソースまたは URL から BarCode を読み取ります。
なぜ非同期読み取りはアプリケーションの応答性を向上させるのですか?
非同期読み取りは、I/Oバウンド操作中にメインスレッドを解放することによって応答性を向上させます。 IronBarcodeがディスクからイメージファイルを読み込んだり、PDFを処理するとき、スレッドはアイドル待機しません。 その代わり、ユーザー入力への応答やリクエストの処理など、その他のタスクを処理します。 これは、特に次のような場合に顕著です:
- 読み込みに時間がかかる大きな画像ファイル
- バーコードを含む複数ページのPDF
- ネットワークベースの画像ソース
- バーコード検出の前に画像補正フィルタを必要とするシナリオ
非同期バーコード読み取りを使用するときの一般的な落とし穴は何ですか?
非同期の BarCode 読み取りを実装する場合は、以下の一般的な問題に注意してください:
1.デッドロック: UI コンテキストの非同期メソッドで Result または Wait() を回避します。 呼び出しチェーン全体では常に await を使用します。
2.例外処理:非同期メソッド内の例外は期待どおりに伝播しない可能性があるため、try-catch ブロックで非同期呼び出しをラップしてください。
3.コンテキスト切り替え: 元の同期コンテキストに戻る必要がない場合は、ConfigureAwait(false) の使用を検討してください。
4.パフォーマンスの誤解:非同期は個々の操作を高速化しない; アプリケーションの応答性が向上します。 複数の画像によるスピードアップのために、マルチスレッドを検討してください。
非同期関連の問題のトラブルシューティングについては、BarCode認識トラブルシューティングガイドを参照してください。
マルチスレッド バーコード読み取りを有効にするにはどうすればよいですか?
非同期操作とは異なり、マルチスレッドは、複数のスレッドにまたがって単一のプロセスを同時に実行します。 マルチスレッドは、単一のスレッドで逐次実行する代わりに、タスクを複数のスレッドに分割して同時実行します。 マルチスレッドには複数の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コア) |
|---|---|---|
| 01.75秒 | 01.67秒 | 01.17秒 |
この比較では、非同期読み取りとマルチスレッド読み取りによってパフォーマンスが大幅に向上することが示されています。 マルチスレッディングは、通常の読み取りと比較して約33%の改善をもたらし、非同期は約5%の改善をもたらします。 しかし、これらの業務は、目的やアプローチが異なります。 アプリケーションの要件に最も適したアプローチを選択してください。
パフォーマンスの向上は、以下によって異なります:
- 処理画像数
- 画像の複雑さとバーコードの品質
- 使用可能なCPUコア
- その他のシステムリソース
1つのドキュメントに複数の BarCode がある場合は、Read Multiple Barcodes ガイドをご覧ください。
いつ非同期操作よりもマルチスレッドを選択すべきですか?
マルチスレッドを選択する場合
1.CPUバウンド操作:複雑な画像フィルターや高解像度画像のような重い計算を伴う処理。 2.バッチ処理:複数の独立した画像を同時に処理する必要がある 3.マルチコアシステム:複数のCPUコアが利用可能なデプロイ環境 4.パフォーマンスが重要:生の処理速度はリソース効率に勝る
非同期処理を選択するのは、次のような場合です:
1.I/Oバウンド操作:ほとんどの時間は、ファイルを読んだり、ネットワークの応答を待ったりします。 2.UIアプリケーション:レスポンシブなユーザーインターフェースの維持は非常に重要です。 3.限られたリソース:限られたCPUコアのシステムで動作 4.Webアプリケーション: 複数の同時リクエストを効率的に処理する
最適な MaxParallelThreads 値はどのように決定しますか?
最適な MaxParallelThreads 値はいくつかの要因によって異なります。
1.利用可能なCPUコア: ベースラインとしてEnvironment.ProcessorCountから開始
2.ワークロードの種類:純粋な BarCode 読み取りには、使用可能なコアの 75% を使用します。
3.システムリソース:OSや他のプロセスのために余裕を持たせる
4.テスト結果: 特定のワークロードでベンチマークを行います。
最適な値を見つけるための実践的なアプローチをご紹介します:
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
本番環境では、パフォーマンスを監視し、実際の使用パターンに基づいて調整します。 最大限のパフォーマンスを必要とするエンタープライズ展開には、ライセンス キー構成の実装を検討してください。
完全なAPI機能については、IronBarcode API Referenceを参照してください。
よくある質問
BarCode を読み取る際の非同期とマルチスレッドの違いは何ですか?
IronBarcodeでは、非同期処理によりファイル読み取りなどのI/Oタスク中にメインスレッドがブロックされるのを防ぎ、マルチスレッドによりCPUコア間で複数のバーコードを同時に処理します。asyncはasync/awaitキーワードを使用して長い操作中にメインスレッドを解放し、マルチスレッドは複数のスレッドを作成して並列にバーコード処理を行います。
C#で非同期バーコード読み取りを実装するには?
IronBarcodeは非同期バーコード読み取り用にReadAsync()とReadPdfAsync()メソッドを提供しています。C#のasync/awaitキーワードでこれらのメソッドを使用するだけで、メインスレッドをブロックすることなく画像やPDFからバーコードを読み取ることができます。これは、複数の画像ファイルや大きなPDF文書を処理する場合に特に有益です。
バーコード処理でマルチスレッドを有効にするにはどうすればよいですか?
IronBarcodeでマルチスレッドを有効にするには、BarcodeReaderOptionsでMultithreadedプロパティを'true'に設定します。また、MaxParallelThreadsプロパティを使用して並列スレッド数を制御することができますので、システムの能力に応じてパフォーマンスを最適化することができます。
パフォーマンスを最適化するために、非同期処理とマルチスレッド処理を組み合わせることはできますか?
はい、IronBarcodeでは両方のアプローチを組み合わせることができます。Multithreaded = trueを設定し、BarcodeReaderOptionsでMaxParallelThreadsを設定することで、マルチスレッドを有効にしてReadAsync()を使用することができます。この組み合わせは、ノンブロッキング I/O 操作と複数の CPU コアにわたる並列処理の両方を提供します。
BarCode の読み取りには、いつ非同期とマルチスレッドを使い分ける必要がありますか?
IronBarcodeで大きなファイルの読み込みやネットワークリクエストのようなI/Oバウンドタスクを扱うときは、UIのフリーズを防ぐために非同期オペレーションを使用してください。複数のBarCodeを同時に処理する必要があり、CPUリソースに余裕がある場合はマルチスレッドを使用します。最良の結果を得るには、複数の大きなバーコード画像やPDFを処理するときに両方のアプローチを組み合わせてください。

