C# を使用したバーコードにおける非同期およびマルチスレッドの使用方法

C#で非同期とマルチスレッドを使う方法 with IronBarcode

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

IronBarcodeの非同期処理とマルチスレッド処理では、バーコード読み取り性能の最適化が異なります。非同期処理ではI/O処理中にメインスレッドがブロックされるのを防ぎ、マルチスレッド処理ではCPUコア間で複数のバーコードを同時に処理します。

開発者は、Multithreadingの操作を混同することがよくあります。 どちらの手法も、システムリソースの利用を最適化し、実行時間を短縮することで、プログラムのパフォーマンスと効率を高めます。しかし、アプローチ、メカニズム、使用例が異なります。 IronBarcodeは両方のアプローチをサポートしています。 この記事では、IronBarcodeを使用したそれぞれの違いや実装について説明します。

クイックスタート: 非同期およびマルチスレッドバーコード読み取り例

このワンラインの例を使用して、即座にIronBarcodeで開始できます。 非同期読み取りとマルチスレッドオプションを組み合わせて、最小限の設定で複数のバーコード画像を並行してスキャンする方法を示しています。

  1. IronBarcode をNuGetパッケージマネージャでインストール

    PM > Install-Package BarCode
  2. このコード スニペットをコピーして実行します。

    var results = await IronBarCode.BarcodeReader.ReadAsync(imagePaths, new IronBarCode.BarcodeReaderOptions { Multithreaded = true, MaxParallelThreads = 4, ExpectMultipleBarcodes = true });
  3. 実際の環境でテストするためにデプロイする

    今日プロジェクトで IronBarcode を使い始めましょう無料トライアル

    arrow pointer


IronBarcodeで非同期にBarCodeを読み取るには?

非同期読み取りにより、長時間またはブロッキング操作がメインスレッドの実行をブロックせずに進行できるようになります。 C#では、非同期機能をサポートするメソッドに対して、awaitキーワードを使用してください。 このアプローチは、追加のスレッドを作成するのではなく、現在のスレッドを解放します。 メインスレッドはタスクを開始し管理しますが、1つのタスクだけに専念するわけではありません。 メインスレッドは、非同期メソッドに関与する必要があるときに戻り、不要なときに他のタスクを処理するために解放されます-ファイルの読み取り/書き込みやネットワーク要求のようなI/Oバウンドタスクに特に便利です。

バーコードの読み取りを例に考えてみましょう。 プロセスには以下が含まれます:

  • ファイルの読み取り
  • 読み取りオプションの適用
  • バーコードのデコード

ファイル読み取り中に、メインタスクが解放されることがあります。 これは、バーコードを読むチュートリアルで示したように、複数の画像ファイルや大きなPDFを使用するシナリオに役立ちます。

画像およびPDFドキュメントのBARCODEを非同期で読み取るには、それぞれ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
$vbLabelText   $csharpLabel

上記のコードスニペットは、IronBarcodeによって非同期で読み込まれる画像パスの配列をインスタンス化しています。 画像を読み込むには、BarcodeReader クラスの ReadAsync メソッドを使用してください。 imagePaths および読み取りオプションを指定してください。 高度な設定オプションについては、BarCodeリーダー設定のガイドを参照してください。

この非同期操作メソッドは、同じクラス内の ReadPdfAsync を通じて PDF 文書内の BARCODE を読み取る場合にも利用可能です。 特定のPDF読み取り設定については、PDFバーコードリーダー設定ガイドを参照してください。

Multithreaded
MaxParallelThreads

通常のメソッドよりも非同期読み取りを使用するのはいつですか?

非同期読み上げは、いくつかのシナリオで優れています:

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 コンテキスト内の非同期メソッドにおいて、ResultWait() の発生を回避してください。 コールチェーン全体を通じて、常に await を使用してください。

2.例外処理:非同期メソッド内の例外は期待どおりに伝播しない可能性があるため、try-catch ブロックで非同期呼び出しをラップしてください。

  1. コンテキストの切り替え: 元の同期コンテキストに戻る必要がない場合は、ConfigureAwait(false) の使用を検討してください。

4.パフォーマンスの誤解:非同期は個々の操作を高速化しない; アプリケーションの応答性が向上します。 複数の画像によるスピードアップのために、マルチスレッドを検討してください。

非同期関連の問題のトラブルシューティングについては、BarCode認識トラブルシューティングガイドを参照してください。

マルチスレッド バーコード読み取りを有効にするにはどうすればよいですか?

非同期操作とは異なり、マルチスレッドは、複数のスレッドにまたがって単一のプロセスを同時に実行します。 マルチスレッドは、単一のスレッドで逐次実行する代わりに、タスクを複数のスレッドに分割して同時実行します。 マルチスレッドには複数のCPUコアが必要で、これらのコアは独立してスレッドを実行します。 非同期操作と同様に、マルチスレッドはアプリケーションのパフォーマンスと応答性を向上させます。

IronBarcode では、Multithreaded プロパティを設定してマルチスレッドを有効にし、MaxParallelThreads を使用して BarcodeReaderOptions 内で同時実行の最大コア数を指定します。 MaxParallelThreads のデフォルト値は 4 ですが、利用可能な CPU コア数に応じて調整可能です。 最適なパフォーマンス設定については、読書速度オプションガイドを参照してください。

ご注意利用可能なコアを見つけるには: タスクマネージャー -> パフォーマンスタブ -> 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
$vbLabelText   $csharpLabel

どの程度のパフォーマンス向上が期待できますか?

2つのサンプル画像を読み取り、通常操作、非同期操作、マルチスレッド操作の読み取り時間を比較してみましょう。

サンプル画像

マルチスレッドバーコード読み取りデモ用の番号 0 123456 789012 を示す UPC-A バーコードの例
マルチスレッドバーコード読み取りデモ用の番号771234567003を示すUPC-Aバーコードサンプル
通常の読み取り 非同期読み取り マルチスレッド読み取り(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 コア数: ベースラインとして `` を使用します
  2. ワークロードタイプ: 単純なバーコード読み取りのために、使用可能なコアの75%を使用
  3. システムリソース: OSや他のプロセスのための予備を残す
  4. テスト結果: 特定のワークロードでベンチマークする

最適な値を見つけるための実践的なアプローチをご紹介します:

int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
$vbLabelText   $csharpLabel

本番環境では、パフォーマンスを監視し、実際の使用パターンに基づいて調整します。 最大限のパフォーマンスを必要とするエンタープライズ展開には、ライセンス キー構成の実装を検討してください。

完全な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を処理するときに両方のアプローチを組み合わせてください。

IronBarcodeをバーコード操作に使用するメリットは何ですか?

IronBarcodeは、統合の容易さ、多数のバーコード形式サポート、高品質の画像生成、強力な読み取り能力などのメリットを提供し、C#での総合的なバーコード操作ツールとなります。

IronBarcodeはバーコードの外観カスタマイズをサポートしていますか?

はい、IronBarcodeはカラー、サイズ、テキスト注釈を含むバーコードの外観に関する詳細なカスタマイズオプションを提供し、特定のデザイン要件に合わせて調整が可能です。

IronBarcodeはビジネスプロセスの効率向上にどのように役立ちますか?

IronBarcodeは迅速かつ正確なバーコード生成と読み取りを可能にし、手動データ入力エラーの減少、在庫および資産追跡の改善などにより、ビジネスプロセスの効率を向上させます。

プロジェクトにIronBarcodeを実装するために必要なプログラミングスキルは何ですか?

IronBarcodeをプロジェクトに実装するためには、C#プログラミングの基本的な知識があれば十分で、開発者をガイドするための簡単なメソッドと包括的なドキュメントが提供されています。

IronBarcodeは小規模プロジェクトと大規模エンタープライズアプリケーションの両方に適していますか?

IronBarcodeはスケーラブルかつ多用途に設計されており、小規模プロジェクトおよび強力なバーコードソリューションを必要とする大規模エンタープライズアプリケーションの両方に適しています。

Hairil Hasyimi Bin Omar
ソフトウェアエンジニア
すべての優れたエンジニアのように、ハイリルは熱心な学習者です。彼はC#、Python、Javaの知識を磨き、その知識を活用してIron Softwareのチームメンバーに価値を追加しています。ハイリルはマレーシアのマラ工科大学からIron Softwareのチームに参加し、化学およびプロセス工学の学士号を取得しました。
準備はできましたか?
Nuget ダウンロード 2,240,258 | バージョン: 2026.5 just released
Still Scrolling Icon

まだスクロールしていますか?

すぐに証拠が欲しいですか? PM > Install-Package BarCode
サンプルを実行する 文字列が BarCode になるのを見る。