IRONSOFTWAREHOME

Comment utiliser Async et le multithreading pour les opérations de QR Code en C#

Curtis Chau
Curtis Chau
Updated: 6 mars 2026

Le scan QR à un seul thread bloque le thread appelant pendant la durée de chaque décodage d'image.

Dans un gestionnaire de bouton WPF, cela fige l'interface utilisateur jusqu'à la fin du décodage. Lors du traitement par lots de centaines d'images, les cœurs du processeur restent inactifs alors qu'ils pourraient fonctionner en parallèle. La méthode ReadAsync de IronQR délègue les lectures individuelles à une tâche attendable, et la méthode standard Read fonctionne avec Parallel.ForEach et Task.WhenAll pour le débit par lots.

Ce guide explique comment traiter les codes QR de manière asynchrone, répartir les lectures par lots sur les cœurs du processeur et combiner les deux modèles pour les pipelines à haut volume.

Démarrage rapide : Traiter des QR Codes de manière asynchrone

Charger une image et attendre les résultats décodés sans bloquer le thread appelant.

  1. 1Install IronQR with NuGet Package Manager

    PM > Install-Package IronQR

  2. 2Copiez et exécutez cet extrait de code.

    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. 3Déployez pour tester sur votre environnement de production.

    Commencez à utiliser IronQR dans votre projet dès aujourd'hui avec un essai gratuit
    arrow pointer

Lecture asynchrone des codes QR

ReadAsync retourne une tâche attendable, ce qui la rend compatible avec les gestionnaires d'événements WPF/MAUI, les actions des contrôleurs ASP.NET ou toute méthode asynchrone. L'entrée doit être construite à partir d'une image bitmap ; il n'y a pas de surcharge de chemin de fichier.

L'écriture est synchrone et ne comporte aucune variante asynchrone. Pour éviter de bloquer le thread pendant l'I/O de fichier, encapsulez l'étape de sauvegarde dans File.WriteAllBytesAsync() en utilisant les octets bruts exportés depuis le bitmap.

Entrée

Un badge d'événement à code QR scanné et régénéré pour illustrer le modèle de lecture et d'écriture asynchrone.

Encodage du code QR https://ironsoftware.com/event-badge utilisé comme entrée de lecture asynchrone
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#

Sortie

Le terminal affiche le type et la valeur du QR décodé au format [QrType] Value, puis confirme que output-qr.png a été sauvegardé.

Affichage du terminal : valeur décodée du code QR et confirmation d'enregistrement du fichier output-qr.png.

QrScanMode.Auto exécute à la fois la détection ML et une passe de scan basique, en remplissant la valeur décodée et le type de QR dans chaque résultat. OnlyDetectionModel est plus rapide mais ne retourne que les coordonnées de la boîte englobante, laissant le champ de valeur vide. Utilisez Auto chaque fois que le contenu encodé est nécessaire.


Traitement des codes QR avec multithreading

Pour les images qui peuvent être décodées indépendamment, Parallel.ForEach distribue le travail sur les cœurs CPU disponibles. Une instance séparée de QrReader par itération est le choix sûr par défaut, car IronQR ne fait aucune garantie explicite de sécurité des threads pour les instances de lecteur partagées.

Entrée

Quatre des dix images de test de code QR utilisées dans le scan par lots parallèle. Chaque image encode une URL et est lue depuis le dossier qr-images/ à l'exécution.

Image d'entrée 1 sur 10 d'un lot de QR codes encodant https://ironsoftware.com/batch-1

Image 1 (Lot 1 sur 10)

Image d'entrée 2 sur 10 d'un lot de QR codes encodant https://ironsoftware.com/batch-2

Image 2 (Lot 2 sur 10)

Image d'entrée 3 sur 10 d'un lot de QR codes encodant https://ironsoftware.com/batch-3

Image 3 (Lot 3 sur 10)

Image d'entrée 4 sur 10 d'un lot de QR codes encodant https://ironsoftware.com/batch-4

Image 4 (Lot 4 sur 10)

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#

Sortie

La console affiche un résumé du traitement par lots, incluant le nombre de fichiers traités, le temps de traitement, les codes QR trouvés, les éventuelles erreurs et le débit. Il liste ensuite chaque nom de fichier avec son URL décodée.

Sortie du terminal affichant les résultats du traitement par lots parallèle : 10 fichiers traités, codes QR trouvés, échecs, débit et URL décodée par nom de fichier

Téléchargez les 10 images d'entrée de code QR du lot de test (batch-qr-images.zip).

ConcurrentBag<t> rassemble les résultats de tous les threads sans nécessiter de verrous. Un compteur thread-safe suit les échecs, et l'utilisation de try-catch pour chaque fichier garantit qu'une image défectueuse n'interrompt pas le traitement par lots entier. Cette approche suit le modèle d'isolation des erreurs décrit dans le guide pratique de gestion des erreurs .

Réglez MaxDegreeOfParallelism sur Environment.ProcessorCount pour aligner sur le nombre de cœurs CPU. L'utilisation de threads supplémentaires augmente la surcharge et n'améliore pas les performances, en particulier pour les modèles d'apprentissage automatique gourmands en ressources CPU.


Combinaison du traitement asynchrone et parallèle

Pour les pipelines à fort volume, associez SemaphoreSlim avec Task.WhenAll pour limiter la concurrence. Contrairement à Parallel.ForEach, ce modèle maintient l'I/O non-bloquant tout en contrôlant combien de décodages s'exécutent en même temps, évitant ainsi la saturation du pool de threads sous des charges importantes.

Entrée

Quatre des vingt images QR code de test traitées par le pipeline concurrent. Chaque image encode une URL et est décodée en parallèle en utilisant une concurrence limitée via SemaphoreSlim.

Image d'entrée QR code du pipeline 1 sur 20

Image 1 (Pipeline 1 sur 20)

Image d'entrée QR code du pipeline 2 sur 20

Image 2 (Pipeline 2 sur 20)

Image d'entrée QR code du pipeline 3 sur 20

Image 3 (Pipeline 3 sur 20)

Image d'entrée QR code du pipeline 4 sur 20

Image 4 (Pipeline 4 sur 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");
C#

Sortie

La console affiche un résumé une fois le pipeline terminé : nombre total de codes QR décodés, nombre de fichiers sources et temps écoulé, suivis du nom de chaque fichier et de son URL décodée.

Sortie du terminal affichant les résultats du pipeline : 20 codes QR provenant de 20 fichiers, avec l'URL décodée pour chaque nom de fichier

Téléchargez les 20 images d'entrée de code QR du pipeline de test (high-volume-qr-images.zip).

Adaptez la limite des sémaphores au nombre de cœurs disponibles pour optimiser le débit, ou réduisez-la lorsque la pression sur la mémoire est un problème avec les images volumineuses.


Lecture supplémentaire

Voir les options de licence lorsque le pipeline est prêt pour la production.

Questions Fréquemment Posées

Qu'est-ce que le traitement asynchrone de codes QR en C# ?

Le traitement asynchrone de codes QR en C# vous permet d'effectuer des opérations de codes QR sans bloquer le thread principal, en utilisant des fonctionnalités comme la méthode ReadAsync d'IronQR pour améliorer la performance et la réactivité.

Comment le multithreading peut-il améliorer le traitement des codes QR ?

Le multithreading peut considérablement améliorer le traitement des codes QR en permettant à plusieurs opérations de s'exécuter simultanément, facilitant des temps de traitement plus rapides et une efficacité améliorée de l'application grâce à l'utilisation d'IronQR.

Qu'est-ce que la méthode ReadAsync dans IronQR ?

La méthode ReadAsync dans IronQR permet la lecture asynchrone des codes QR, permettant à votre application C# de gérer les données de codes QR sans retarder d'autres tâches.

Comment Parallel.ForEach aide-t-il au traitement des codes QR ?

Parallel.ForEach permet de traiter simultanément plusieurs codes QR en distribuant les tâches sur plusieurs threads, ce qui peut être efficacement utilisé avec IronQR pour accélérer les opérations de code QR.

Quel rôle joue SemaphoreSlim dans les opérations sur les codes QR ?

SemaphoreSlim est utilisé pour limiter le nombre de tâches concurrentes, aidant à gérer les ressources efficacement pendant le traitement parallèle des codes QR avec IronQR.

IronQR peut-il être utilisé pour le traitement des codes QR dans un pipeline limité ?

Oui, IronQR peut être utilisé pour traiter les codes QR dans un pipeline limité, en utilisant des constructions comme SemaphoreSlim pour contrôler la concurrence et l'allocation des ressources.

Quels sont les avantages d'utiliser IronQR pour les opérations asynchrones sur les codes QR ?

Utiliser IronQR pour les opérations asynchrones sur les codes QR améliore la réactivité de l'application, réduit le blocage du thread principal et permet une gestion efficace de gros volumes de données de codes QR.

Est-il possible d'exécuter des opérations sur les codes QR en parallèle en utilisant IronQR ?

Oui, IronQR prend en charge le traitement parallèle des opérations sur les codes QR, vous permettant de tirer parti des capacités de multithreading en C# pour un traitement des codes QR plus rapide et plus efficace.

Comment IronQR améliore-t-il le traitement des codes QR dans les applications C# ?

IronQR améliore le traitement des codes QR en fournissant des capacités robustes d'asynchronie et de multithreading, réduisant les temps de traitement et améliorant la scalabilité des applications C#.

Quelles fonctionnalités C# complètent l'utilisation d'IronQR pour le traitement des codes QR ?

Les fonctionnalités C# telles que async/await, Parallel.ForEach et SemaphoreSlim complètent IronQR, fournissant un cadre pour un traitement des codes QR efficace et haute performance.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes et créer des manuels bien structurés et visuellement attrayants.

...
Lire la suite

Prêt à commencer?

Nuget Downloads 74,386Version :2026.9vient de sortir

Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise
Bibliothèque C# NuGet pour PDF
Installer avec NuGet

Version : 2026.9

PM > Install-Package IronQR
nuget.org/packages/IronQR/
  1. Dans l'explorateur de solutions, faites un clic droit sur Références, Gestion des packages NuGet
  2. Sélectionnez Parcourir et recherchez « IronQR »
  3. Sélectionnez le package et installez
C# PDF DLL
Télécharger DLL

Version : 2026.9

  1. Téléchargez et décompressez IronQR à un emplacement tel que ~/Libs dans votre répertoire de Solution
  2. Dans Visual Studio Solution Explorer, cliquez avec le bouton droit sur Références. Sélectionnez Parcourir, « IronQR.dll »

Licences à partir de 749 $

Vous avez une question ? Contactez notre équipe de développement.

Key in blue circle

Obtenez votre clé d'essai de 30 jours instantanément.

Your trial license will be sent to your email address

Aucune restriction. 100 % débloqué. Pas de carte bancaire.

bullet_checkedAucune carte de crédit ou création de compte requiseAucune restriction. 100 % débloqué. Pas de carte bancaire.
  • Logo Aetna
  • Logo NASA
  • Logo GE
  • Logo Porsche
  • Logo USDA
  • Logo Qatar
Join Millions of Engineers who’ve tried IronPDF
Réservez votre Démonstration en direct gratuite
Booking Badge

De confiance par des millions d'ingénieurs dans le monde entier

Logos des clients d'Iron Software
Obtenez Votre Consultation sans Engagement
Remplissez le formulaire ci-dessous ou envoyez un email à sales@ironsoftware.com
Vos informations seront toujours gardées confidentielles.
De confiance par des millions d'ingénieurs dans le monde entier
Logos des clients d'Iron Software
Obtenez votre clé d'essai 30 jours gratuitement.
Aucune carte de crédit ou création de compte requise