QRコード操作で非同期とマルチスレッドをC#で使用する方法 Copy for LLMsCopy for LLMs Copy page as Markdown for LLMs
# QRコード操作で非同期とマルチスレッドをC#で使用する方法
単一スレッドのQRスキャンは、すべての画像デコードの間、呼び出しスレッドをブロックします。
WPFのボタンハンドラーでは、デコードが完了するまでUIがフリーズします。 数百枚の画像を処理するバッチ処理では、並列処理が可能なCPUコアがアイドル状態になってしまう。 IronQRの`Task.WhenAll`と連携して動作します。
このガイドでは、QRコードを非同期で処理する方法、バッチ読み取りをCPUコア全体に分散させる方法、および両方のパターンを組み合わせて大容量パイプラインを構築する方法について説明します。
*as-heading:2(クイックスタート: QRコードを非同期で処理する)*
画像を読み込み、呼び出し元のスレッドをブロックせずにデコード結果を待機します。
```csharp
:title=Quickstart
using IronQr;
using IronSoftware.Drawing;
var input = new QrImageInput(AnyBitmap.FromFile("ticket.png"));
IEnumerable<QrResult> results = await new QrReader().ReadAsync(input);
Console.WriteLine(results.First().Value);
```
<div class="hsg-featured-snippet">
<h3>最小限のワークフロー(5ステップ)</h3>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/IronQR/">非同期QRコード処理のためのIronQR C#ライブラリをダウンロード</a></li>
<li>非ブロッキングの単一読み取りには<code>ReadAsync</code>使用してください。</li>
<li><code>Parallel.ForEach</code>を使用してCPUバウンドバッチ処理を行う</li>
<li><code>SemaphoreSlim</code>と組み合わせて制限付き同時実行パイプラインを作成する</li>
<li><code>IEnumerable<QrResult></code>から結果を取得し、デコードされた値を表示します。</li>
</ol>
</div>
## QRコードを非同期で読み取る
`ReadAsync`は待機可能なタスクを返すため、WPF/MAUIのイベントハンドラー、ASP.NETのコントローラーアクション、または任意の非同期メソッドと互換性があります。 入力は画像ビットマップから構築する必要があり、ファイルパスによる指定はできません。
書き込み側は同期処理であり、非同期処理のバリエーションはありません。 ファイルI/O中にスレッドがブロックされないように、ビットマップからエクスポートされた生のバイトを使用して、`File.WriteAllBytesAsync()`で保存ステップをラップしてください。
### 入力
非同期読み書きパターンを実証するために、QRコードイベントバッジをスキャンして再生成した。
<div class="content-img-align-center">
<div class="center-image-wrapper" style="max-width: 300px;">
<img src="/static-assets/qr/how-to/async-and-multithreading/input-async-event-badge.webp"
alt="QRコードエンコーディング(https://ironsoftware.com/event-badge)を非同期読み取り入力として使用"
class="img-responsive add-shadow" />
</div>
</div>
```cs
:path=/static-assets/qr/content-code-examples/how-to/async-and-multithreading/async-read-write.cs
```
### 出力
ターミナルには、デコードされたQRタイプと値が`output-qr.png`が保存されたことが確認されます。
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/qr/how-to/async-and-multithreading/test1-async-out.webp" alt="ターミナル出力には、[QRコード]のデコード値とoutput-qr.pngの保存確認が表示されます。" class="img-responsive add-shadow" />
</div>
</div>
`QrScanMode.Auto`は、ML検出と基本的なスキャンパスを両方実行し、各結果にデコード済みの値とQRタイプを入力します。 `OnlyDetectionModel`はより速いですが、バウンディングボックスの座標のみを返し、値フィールドは空のままです。 エンコードされたコンテンツが必要なときはいつでも`Auto`を使用してください。
---
## マルチスレッドによるQRコードの処理
独立してデコードできる画像に対して、`Parallel.ForEach`は利用可能なCPUコアに作業を分散します。 各イテレーションごとの`QrReader`インスタンスが安全なデフォルトです。IronQRは、共有リーダーインスタンスの明確なスレッドセーフティについて保証していないためです。
### 入力
並列バッチスキャンで使用された10個のQRコードテスト画像のうち4個。 各画像はURLをエンコードし、実行時に`qr-images/`フォルダから読み取られます。
<div class="competitors-section__wrapper-even-1">
<div class="competitors__card" style="width: 47%;">
<img src="/static-assets/qr/how-to/async-and-multithreading/input-batch-qr-1.webp"
alt="https://ironsoftware.com/batch-1 をエンコードしたバッチ QR コード入力画像 10 枚中 1 枚目"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
画像1(全10枚中1枚目)
</p>
</div>
<div class="competitors__card" style="width: 47%;">
<img src="/static-assets/qr/how-to/async-and-multithreading/input-batch-qr-2.webp"
alt="https://ironsoftware.com/batch-2 をエンコードしたバッチ QR コード入力画像 10 枚中 2 枚目"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
画像2(全10枚中2枚目)
</p>
</div>
</div>
<div class="competitors-section__wrapper-even-1">
<div class="competitors__card" style="width: 47%;">
<img src="/static-assets/qr/how-to/async-and-multithreading/input-batch-qr-3.webp"
alt="https://ironsoftware.com/batch-3 をエンコードしたバッチ QR コード入力画像 10 枚中 3 枚目"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
画像3(全10枚中3枚目)
</p>
</div>
<div class="competitors__card" style="width: 47%;">
<img src="/static-assets/qr/how-to/async-and-multithreading/input-batch-qr-4.webp"
alt="https://ironsoftware.com/batch-4 をエンコードしたバッチ QR コード入力画像 10 枚中 4 枚目"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
画像4(全10枚中4枚目)
</p>
</div>
</div>
```cs
:path=/static-assets/qr/content-code-examples/how-to/async-and-multithreading/parallel-batch.cs
```
### 出力
コンソールには、処理されたファイル数、処理時間、検出されたQRコード数、発生したエラー、スループットなどを含むバッチの概要が表示されます。 次に、各ファイル名とそのデコードされたURLを一覧表示します。
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/qr/how-to/async-and-multithreading/test2-async-output.webp" alt="並列バッチ処理結果を示すターミナル出力:処理されたファイル数、検出されたQRコード数、エラー数、スループット、ファイル名ごとのデコードされたURL" class="img-responsive add-shadow" />
</div>
</div>
[テストバッチ用のQRコード入力画像10枚すべてをダウンロードしてください(batch-qr-images.zip)。](/static-assets/qr/how-to/async-and-multithreading/batch-qr-images.zip)
`ConcurrentBag<t>`はロックを必要とせず、すべてのスレッドから結果を集めます。 スレッドセーフなカウンターが障害を追跡し、各ファイルにtry-catchブロックを使用することで、1つの不良画像がバッチ処理全体を中断させないようにしています。 このアプローチは[、エラー処理のハウツー](/csharp/qr/how-to/detailed-error-messages)で説明されているエラー分離パターンに従います。
CPUコアの数に合わせるために、`Environment.ProcessorCount`に設定してください。 スレッド数を増やすとオーバーヘッドが増加するだけで、特にCPU負荷の高い機械学習モデルではパフォーマンスが向上しません。
---
## 非同期処理と並列処理の組み合わせ
高ボリュームのパイプラインには、`SemaphoreSlim`を使用し、同時並行性を制限してください。 `Parallel.ForEach`とは異なり、このパターンでは、一度に実行されるデコードの数を制御しながら、I/Oを非ブロッキングのままに保ち、大きなワークロードでのスレッドプールの飽和を防ぎます。
### 入力
並行パイプラインで処理された20個のQRコードテスト画像のうちの4つ。各画像はURLをエンコードしており、`SemaphoreSlim`を介して制限付きの並行性を使用して並行にデコードされます。
<div class="competitors-section__wrapper-even-1">
<div class="competitors__card" style="width: 47%;">
<img src="/static-assets/qr/how-to/async-and-multithreading/input-pipeline-qr-1.webp"
alt="パイプライン QR コード入力画像 20 枚中 1 枚目"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
画像1(パイプライン1/20)
</p>
</div>
<div class="competitors__card" style="width: 47%;">
<img src="/static-assets/qr/how-to/async-and-multithreading/input-pipeline-qr-2.webp"
alt="パイプライン QR コード入力画像 20 枚中 2 枚目"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
画像2(パイプライン2/20)
</p>
</div>
</div>
<div class="competitors-section__wrapper-even-1">
<div class="competitors__card" style="width: 47%;">
<img src="/static-assets/qr/how-to/async-and-multithreading/input-pipeline-qr-3.webp"
alt="パイプライン QR コード入力画像 20 枚中 3 枚目"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
画像3(パイプライン3/20)
</p>
</div>
<div class="competitors__card" style="width: 47%;">
<img src="/static-assets/qr/how-to/async-and-multithreading/input-pipeline-qr-4.webp"
alt="パイプライン QR コード入力画像 20 枚中 4 枚目"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
画像4(パイプライン4/20)
</p>
</div>
</div>
```cs
:path=/static-assets/qr/content-code-examples/how-to/async-and-multithreading/semaphore-pipeline.cs
```
### 出力
パイプラインが完了すると、コンソールに概要が表示されます。表示されるのは、デコードされたQRコードの総数、ソースファイルの数、経過時間、そして各ファイル名とそのデコードされたURLです。
<div class="content-img-align-center">
<div class="center-image-wrapper">
<img src="/static-assets/qr/how-to/async-and-multithreading/test3async-output.webp" alt="パイプラインの結果を示すターミナル出力: ファイル名ごとにデコードされたURLを含む20個のファイルからの20個のQRコード" class="img-responsive add-shadow" />
</div>
</div>
[テストパイプラインのQRコード入力画像20枚すべてをダウンロードしてください(high-volume-qr-images.zip)。](/static-assets/qr/how-to/async-and-multithreading/high-volume-qr-images.zip)
スループットを最大化するために、セマフォの制限値を利用可能なコア数に合わせるか、大きな画像でメモリ負荷が懸念される場合は、制限値を下げてください。
---
## さらなる読み物
- [MLスキャン例](https://ironsoftware.com/csharp/qr/examples/read-qr-with-machine-learning/):コードサンプルを用いたスキャンモードの比較。
- [QRコードの読み取り方法](https://ironsoftware.com/csharp/qr/how-to/read-qr-codes-from-image/):入力構造と基本的な読み取りパターン。
- [QRコード生成チュートリアル](https://ironsoftware.com/csharp/qr/tutorials/csharp-qr-code-generator/):スタイル設定付き生成。
- [QrReader APIリファレンス](https://ironsoftware.com/csharp/qr/object-reference/api/IronQr.QrReader.html):メソッドのシグネチャと注釈。
- [QrWriter API リファレンス](https://ironsoftware.com/csharp/qr/object-reference/api/IronQr.QrWriter.html):すべての書き込みオーバーロード。
-[エラー処理方法](/csharp/qr/how-to/detailed-error-messages):ファイルごとのエラー分離とログ記録パターン。
[パイプラインが生産準備が整ったときのライセンスオプションを表示](https://ironsoftware.com/csharp/qr/licensing/)
Ask ChatGPT about this page
Ask Gemini about this page
Ask Perplexity about this page
単一スレッドのQRスキャンは、すべての画像デコードの間、呼び出しスレッドをブロックします。
WPFのボタンハンドラーでは、デコードが完了するまでUIがフリーズします。 数百枚の画像を処理するバッチ処理では、並列処理が可能なCPUコアがアイドル状態になってしまう。 IronQRのTask.WhenAllと連携して動作します。
このガイドでは、QRコードを非同期で処理する方法、バッチ読み取りをCPUコア全体に分散させる方法、および両方のパターンを組み合わせて大容量パイプラインを構築する方法について説明します。
画像を読み込み、呼び出し元のスレッドをブロックせずにデコード結果を待機します。
1 Install IronQR with NuGet Package Manager
PM > Install-Package IronQR
Install-Package IronQR
2 このコード スニペットをコピーして実行します。
using IronQr ;
using IronSoftware . Drawing ;
var input = new QrImageInput ( AnyBitmap . FromFile ( "ticket.png" ));
IEnumerable < QrResult > results = await new QrReader (). ReadAsync (input);
Console . WriteLine (results. First (). Value );
using IronQr;
using IronSoftware.Drawing;
var input = new QrImageInput(AnyBitmap.FromFile("ticket.png"));
IEnumerable<QrResult> results = await new QrReader().ReadAsync(input);
Console.WriteLine(results.First().Value);
C#
3 実際の環境でテストするためにデプロイする
今日プロジェクトで IronQR を使い始めましょう無料トライアル
30日間無料トライアル
最小限のワークフロー(5ステップ) 非同期QRコード処理のためのIronQR C#ライブラリをダウンロード 非ブロッキングの単一読み取りにはReadAsync使用してください。 Parallel.ForEachを使用してCPUバウンドバッチ処理を行うSemaphoreSlimと組み合わせて制限付き同時実行パイプラインを作成するIEnumerable<QrResult>から結果を取得し、デコードされた値を表示します。
QRコードを非同期で読み取る
ReadAsyncは待機可能なタスクを返すため、WPF/MAUIのイベントハンドラー、ASP.NETのコントローラーアクション、または任意の非同期メソッドと互換性があります。 入力は画像ビットマップから構築する必要があり、ファイルパスによる指定はできません。
書き込み側は同期処理であり、非同期処理のバリエーションはありません。 ファイルI/O中にスレッドがブロックされないように、ビットマップからエクスポートされた生のバイトを使用して、File.WriteAllBytesAsync()で保存ステップをラップしてください。
入力
非同期読み書きパターンを実証するために、QRコードイベントバッジをスキャンして再生成した。
using IronQr ;
using IronQr . Enum ;
using IronSoftware . Drawing ;
// --- Async read: non-blocking QR decode ---
var inputBmp = AnyBitmap . FromFile ( "event-badge.png" );
var imageInput = new QrImageInput (inputBmp, QrScanMode . Auto );
var reader = new QrReader ();
IEnumerable < QrResult > results = await reader. ReadAsync (imageInput);
foreach ( QrResult result in results)
{
Console . WriteLine ( $"[ { result . QrType } ] { result . Value } " );
}
// --- Async-wrapped save: QrWriter.Write() and QrCode.Save() are synchronous ---
QrCode qrCode = QrWriter . Write ( "https://ironsoftware.com" );
AnyBitmap qrImage = qrCode. Save ();
// Save the bitmap bytes asynchronously (not an IronQR API — standard .NET async I/O)
byte [] pngBytes = qrImage. ExportBytes ();
await File . WriteAllBytesAsync ( "output-qr.png" , pngBytes);
using IronQr;
using IronQr.Enum;
using IronSoftware.Drawing;
// --- Async read: non-blocking QR decode ---
var inputBmp = AnyBitmap.FromFile("event-badge.png");
var imageInput = new QrImageInput(inputBmp, QrScanMode.Auto);
var reader = new QrReader();
IEnumerable<QrResult> results = await reader.ReadAsync(imageInput);
foreach (QrResult result in results)
{
Console.WriteLine($"[{result.QrType}] {result.Value}");
}
// --- Async-wrapped save: QrWriter.Write() and QrCode.Save() are synchronous ---
QrCode qrCode = QrWriter.Write("https://ironsoftware.com");
AnyBitmap qrImage = qrCode.Save();
// Save the bitmap bytes asynchronously (not an IronQR API — standard .NET async I/O)
byte[] pngBytes = qrImage.ExportBytes();
await File.WriteAllBytesAsync("output-qr.png", pngBytes);
C#
出力
ターミナルには、デコードされたQRタイプと値がoutput-qr.pngが保存されたことが確認されます。
QrScanMode.Autoは、ML検出と基本的なスキャンパスを両方実行し、各結果にデコード済みの値とQRタイプを入力します。 OnlyDetectionModelはより速いですが、バウンディングボックスの座標のみを返し、値フィールドは空のままです。 エンコードされたコンテンツが必要なときはいつでもAutoを使用してください。
マルチスレッドによるQRコードの処理
独立してデコードできる画像に対して、Parallel.ForEachは利用可能なCPUコアに作業を分散します。 各イテレーションごとのQrReaderインスタンスが安全なデフォルトです。IronQRは、共有リーダーインスタンスの明確なスレッドセーフティについて保証していないためです。
入力
並列バッチスキャンで使用された10個のQRコードテスト画像のうち4個。 各画像はURLをエンコードし、実行時にqr-images/フォルダから読み取られます。
画像1(全10枚中1枚目)
画像2(全10枚中2枚目)
画像3(全10枚中3枚目)
画像4(全10枚中4枚目)
using IronQr ;
using IronQr . Enum ;
using IronSoftware . Drawing ;
using System . Collections . Concurrent ;
using System . Diagnostics ;
string [] files = Directory . GetFiles ( "qr-images/" , "*.png" );
var allResults = new ConcurrentBag <( string File , string Value )>();
int failCount = 0 ;
var sw = Stopwatch . StartNew ();
Parallel . ForEach (files, new ParallelOptions { MaxDegreeOfParallelism = Environment . ProcessorCount }, file =>
{
try
{
var input = new QrImageInput (
AnyBitmap . FromFile (file),
QrScanMode . Auto );
// Per-thread QrReader instance — safe default
var results = new QrReader (). Read (input);
foreach ( QrResult result in results)
{
allResults. Add (( Path . GetFileName (file), result. Value ));
}
}
catch ( Exception ex)
{
Interlocked . Increment ( ref failCount);
Console . Error . WriteLine ( $"[ERROR] { Path . GetFileName ( file )} : { ex . Message } " );
}
});
sw. Stop ();
Console . WriteLine ( $"Processed { files . Length } files in { sw . Elapsed . TotalSeconds : F1 } s" );
Console . WriteLine ( $"QR codes found: { allResults . Count } | Failures: { failCount } " );
Console . WriteLine ( $"Throughput: { files . Length / sw . Elapsed . TotalSeconds : F1 } files/sec" );
using IronQr;
using IronQr.Enum;
using IronSoftware.Drawing;
using System.Collections.Concurrent;
using System.Diagnostics;
string[] files = Directory.GetFiles("qr-images/", "*.png");
var allResults = new ConcurrentBag<(string File, string Value)>();
int failCount = 0;
var sw = Stopwatch.StartNew();
Parallel.ForEach(files, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, file =>
{
try
{
var input = new QrImageInput(
AnyBitmap.FromFile(file),
QrScanMode.Auto);
// Per-thread QrReader instance — safe default
var results = new QrReader().Read(input);
foreach (QrResult result in results)
{
allResults.Add((Path.GetFileName(file), result.Value));
}
}
catch (Exception ex)
{
Interlocked.Increment(ref failCount);
Console.Error.WriteLine($"[ERROR] {Path.GetFileName(file)}: {ex.Message}");
}
});
sw.Stop();
Console.WriteLine($"Processed {files.Length} files in {sw.Elapsed.TotalSeconds:F1}s");
Console.WriteLine($"QR codes found: {allResults.Count} | Failures: {failCount}");
Console.WriteLine($"Throughput: {files.Length / sw.Elapsed.TotalSeconds:F1} files/sec");
C#
出力
コンソールには、処理されたファイル数、処理時間、検出されたQRコード数、発生したエラー、スループットなどを含むバッチの概要が表示されます。 次に、各ファイル名とそのデコードされたURLを一覧表示します。
テストバッチ用のQRコード入力画像10枚すべてをダウンロードしてください(batch-qr-images.zip)。
ConcurrentBag<t>はロックを必要とせず、すべてのスレッドから結果を集めます。 スレッドセーフなカウンターが障害を追跡し、各ファイルにtry-catchブロックを使用することで、1つの不良画像がバッチ処理全体を中断させないようにしています。 このアプローチは、エラー処理のハウツー で説明されているエラー分離パターンに従います。
CPUコアの数に合わせるために、Environment.ProcessorCountに設定してください。 スレッド数を増やすとオーバーヘッドが増加するだけで、特にCPU負荷の高い機械学習モデルではパフォーマンスが向上しません。
非同期処理と並列処理の組み合わせ
高ボリュームのパイプラインには、SemaphoreSlimを使用し、同時並行性を制限してください。 Parallel.ForEachとは異なり、このパターンでは、一度に実行されるデコードの数を制御しながら、I/Oを非ブロッキングのままに保ち、大きなワークロードでのスレッドプールの飽和を防ぎます。
入力
並行パイプラインで処理された20個のQRコードテスト画像のうちの4つ。各画像はURLをエンコードしており、SemaphoreSlimを介して制限付きの並行性を使用して並行にデコードされます。
画像1(パイプライン1/20)
画像2(パイプライン2/20)
画像3(パイプライン3/20)
画像4(パイプライン4/20)
using IronQr ;
using IronQr . Enum ;
using IronSoftware . Drawing ;
using System . Collections . Concurrent ;
using System . Diagnostics ;
string [] files = Directory . GetFiles ( "high-volume/" , "*.png" );
var results = new ConcurrentBag <( string File , string Value )>();
int maxConcurrency = Environment . ProcessorCount ;
using var semaphore = new SemaphoreSlim (maxConcurrency);
var sw = Stopwatch . StartNew ();
var tasks = files. Select ( async file =>
{
await semaphore. WaitAsync ();
try
{
var bmp = AnyBitmap . FromFile (file);
// Auto: runs ML detection plus a basic scan so result.Value is populated
var input = new QrImageInput (bmp, QrScanMode . Auto );
var qrResults = await new QrReader (). ReadAsync (input);
foreach ( var qr in qrResults)
{
results. Add (( Path . GetFileName (file), qr. Value ));
}
}
catch ( Exception ex)
{
Console . Error . WriteLine ( $"{{ \" file \" : \" { Path . GetFileName ( file )} \" , \" error \" : \" { ex . Message } \" }}" );
}
finally
{
semaphore. Release ();
}
});
await Task . WhenAll (tasks);
sw. Stop ();
Console . WriteLine ( $"Pipeline complete: { results . Count } QR codes from { files . Length } files in { sw . Elapsed . TotalSeconds : F1 } s" );
using IronQr;
using IronQr.Enum;
using IronSoftware.Drawing;
using System.Collections.Concurrent;
using System.Diagnostics;
string[] files = Directory.GetFiles("high-volume/", "*.png");
var results = new ConcurrentBag<(string File, string Value)>();
int maxConcurrency = Environment.ProcessorCount;
using var semaphore = new SemaphoreSlim(maxConcurrency);
var sw = Stopwatch.StartNew();
var tasks = files.Select(async file =>
{
await semaphore.WaitAsync();
try
{
var bmp = AnyBitmap.FromFile(file);
// Auto: runs ML detection plus a basic scan so result.Value is populated
var input = new QrImageInput(bmp, QrScanMode.Auto);
var qrResults = await new QrReader().ReadAsync(input);
foreach (var qr in qrResults)
{
results.Add((Path.GetFileName(file), qr.Value));
}
}
catch (Exception ex)
{
Console.Error.WriteLine($"{{\"file\":\"{Path.GetFileName(file)}\",\"error\":\"{ex.Message}\"}}");
}
finally
{
semaphore.Release();
}
});
await Task.WhenAll(tasks);
sw.Stop();
Console.WriteLine($"Pipeline complete: {results.Count} QR codes from {files.Length} files in {sw.Elapsed.TotalSeconds:F1}s");
C#
出力
パイプラインが完了すると、コンソールに概要が表示されます。表示されるのは、デコードされたQRコードの総数、ソースファイルの数、経過時間、そして各ファイル名とそのデコードされたURLです。
テストパイプラインのQRコード入力画像20枚すべてをダウンロードしてください(high-volume-qr-images.zip)。
スループットを最大化するために、セマフォの制限値を利用可能なコア数に合わせるか、大きな画像でメモリ負荷が懸念される場合は、制限値を下げてください。
さらなる読み物
パイプラインが生産準備が整ったときのライセンスオプションを表示
よくある質問 C# での非同期 QR コード処理により、メインスレッドをブロックせずに QR コード操作を行うことができます。IronQR の ReadAsync メソッドのような機能を使用して、パフォーマンスと応答性を向上させます。
マルチスレッド処理は、複数の操作を並行して実行できるようにすることで、QR コード処理を大幅に向上させ、IronQR を使用してアプリケーションの効率を改善します。
IronQR の ReadAsync メソッドは、QR コードデータを他のタスクを遅らせることなく処理できるようにする、非同期 QR コード読み取りを可能にします。
Parallel.ForEach は、複数の QR コードを同時に処理し、タスクを複数のスレッドに分配することで、IronQR との効率的な利用が可能となり、QR コード操作のスピードアップを図れます。
SemaphoreSlim は同時実行タスクの数を制限し、IronQR を使った QR コードの並列処理中にリソースを効果的に管理するのを助けます。
はい、IronQR を使用して、Semaphoreslim のような構造を用いて並行性とリソースの割り当ても制御しながら、制限付きパイプラインで QR コードを処理できます。
非同期 QR コード操作のために IronQR を使用することで、アプリケーションの応答性が向上し、メインスレッドでのブロックが減少し、大量のQR コードデータを効率的に処理できます。
はい、IronQR は QR コード操作の並列処理をサポートしており、C# のマルチスレッド機能を活用して、より迅速かつ効率的な QR コード処理が可能です。
IronQR は、強力な非同期およびマルチスレッド機能を提供し、処理時間を短縮し、C# アプリケーションのスケーラビリティを向上させます。
C# の機能である async/await、Parallel.ForEach、および SemaphoreSlim は IronQR を補完し、効率的で高性能な QR コード処理のためのフレームワークを提供します。
テクニカルライター
Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。
...
詳しく読む