C#'de QR Kod İşlemleri için Async ve Çoklu İş Parçacığı Nasıl Kullanılır
Tek iş parçacıklı QR taraması, her görüntü çözümlemesi süresince çağıran iş parçacığını engeller.
Bir WPF buton işleyicisinde bu, çözümleme tamamlanana kadar UI'yı dondurur. Yüzlerce görüntü işleyen bir toplu işte, bu, CPU çekirdeklerini paralel çalışabilecekken boşta bırakır. IronQR'nin ReadAsync yöntemi, tek tek okumaları bekleyebilir bir göreve aktarır ve standart Read yöntemi, toplu iş hacmi için Parallel.ForEach ve Task.WhenAll ile birlikte çalışır.
Bu kılavuz, QR kodlarını eş zamanlı olarak nasıl işleyebileceğinizi, toplu okumaları CPU çekirdeklerine nasıl dağıtabileceğinizi ve yüksek hacimli boru hatları için her iki deseni nasıl birleştirebileceğinizi gösterir.
Hızlı Başlangıç: QR Kodları Eş Zamanlı İşleme
Çağıran iş parçacığını engellemeden, bir resmi yükleyin ve çözüm sonuçlarını bekleyin.
-
IronQR aşağıdaki NuGet Paket Yöneticisi ile yükleyin
PM > Install-Package IronQR -
Bu kod parçacığını kopyalayın ve çalıştırın.
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); -
Canlı ortamınızda test için dağıtım yapın
Ücretsiz deneme ile bugün projenizde IronQR kullanmaya başlayın
Asgari İş Akışı (5 adım)
- Async QR kod işlemi için IronQR C# kütüphanesini indirin
- Bloke olmayan tekli okumalar için
ReadAsynckullanın - CPU tabanlı toplu işlem için
Parallel.ForEachkullanın - Sınırlandırılmış eş zamanlılık boru hatları için
SemaphoreSlimile birleştirin IEnumerablesonuçlarını toplayın ve çözülmüş değerleri yazdırın
QR Kodlarını Eş Zamanlı Olarak Okuma
ReadAsync, bekleyebilir bir görev döndürür ve bu da onu WPF/MAUI olay işleyicileri, ASP.NET denetleyici eylemleri veya herhangi bir asenkron yöntemle uyumlu hale getirir. Giriş, bir görüntü bitmap'inden oluşturulmalıdır; dosya yolu aşırı yükü yoktur.
Yazma tarafı eş zamanlıdır ve async çeşitleri yoktur. Dosya G/Ç sırasında iş parçacığının bloke edilmesini önlemek için, bitmap'ten dışa aktarılan ham baytları kullanarak kaydetme adımını File.WriteAllBytesAsync() içine alın.
Giriş
Bir QR kod etkinlik rozeti, async okuma ve yazma desenini göstermek için tarandı ve yeniden oluşturuldu.
:path=/static-assets/qr/content-code-examples/how-to/async-and-multithreading/async-read-write.cs
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.OnlyDetectionModel);
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);
Imports IronQr
Imports IronQr.Enum
Imports IronSoftware.Drawing
Imports System.IO
' --- Async read: non-blocking QR decode ---
Dim inputBmp = AnyBitmap.FromFile("event-badge.png")
Dim imageInput = New QrImageInput(inputBmp, QrScanMode.OnlyDetectionModel)
Dim reader = New QrReader()
Dim results As IEnumerable(Of QrResult) = Await reader.ReadAsync(imageInput)
For Each result As QrResult In results
Console.WriteLine($"[{result.QrType}] {result.Value}")
Next
' --- Async-wrapped save: QrWriter.Write() and QrCode.Save() are synchronous ---
Dim qrCode As QrCode = QrWriter.Write("https://ironsoftware.com")
Dim qrImage As AnyBitmap = qrCode.Save()
' Save the bitmap bytes asynchronously (not an IronQR API — standard .NET async I/O)
Dim pngBytes As Byte() = qrImage.ExportBytes()
Await File.WriteAllBytesAsync("output-qr.png", pngBytes)
Çıktı
Terminal, kod çözülmüş QR türünü ve değerini [QrType] Value biçiminde görüntüler, ardından output-qr.png'nin kaydedildiğini onaylar.
QrScanMode.Auto hem ML algılama hem de temel tarama geçişini çalıştırır ve her sonuçta kod çözülmüş değeri ve QR türünü doldurur. OnlyDetectionModel daha hızlıdır ancak yalnızca sınırlayıcı kutu koordinatlarını döndürür ve değer alanını boş bırakır. Kodlanmış içeriğe ihtiyaç duyulduğunda Auto kullanın.
QR Kodlarını Çoklu İş Parçacığı ile İşleme
Bağımsız olarak kod çözülebilen görüntüler için, Parallel.ForEach mevcut CPU çekirdekleri arasında işi dağıtır. IronQR, paylaşılan okuyucu örnekleri için açık bir iş parçacığı güvenliği garantisi vermediğinden, her yineleme için ayrı bir QrReader örneği kullanmak güvenli varsayılan seçenektir.
Giriş
Paralel toplu taramada kullanılan on QR kod test görüntüsünden dördü. Her resim bir URL'yi kodlar ve çalışma zamanında qr-images/ klasöründen okunur.
Görüntü 1 (Toplu 1 of 10)
Görüntü 2 (Toplu 2 of 10)
Görüntü 3 (Toplu 3 of 10)
Görüntü 4 (Toplu 4 of 10)
:path=/static-assets/qr/content-code-examples/how-to/async-and-multithreading/parallel-batch.cs
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.OnlyDetectionModel);
// 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");
Imports IronQr
Imports IronQr.Enum
Imports IronSoftware.Drawing
Imports System.Collections.Concurrent
Imports System.Diagnostics
Dim files As String() = Directory.GetFiles("qr-images/", "*.png")
Dim allResults As New ConcurrentBag(Of (File As String, Value As String))()
Dim failCount As Integer = 0
Dim sw As Stopwatch = Stopwatch.StartNew()
Parallel.ForEach(files, New ParallelOptions With {.MaxDegreeOfParallelism = Environment.ProcessorCount}, Sub(file)
Try
Dim input As New QrImageInput(AnyBitmap.FromFile(file), QrScanMode.OnlyDetectionModel)
' Per-thread QrReader instance — safe default
Dim results = New QrReader().Read(input)
For Each result As QrResult In results
allResults.Add((Path.GetFileName(file), result.Value))
Next
Catch ex As Exception
Interlocked.Increment(failCount)
Console.Error.WriteLine($"[ERROR] {Path.GetFileName(file)}: {ex.Message}")
End Try
End Sub)
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")
Çıktı
Konsol, işlenen dosya sayısı, işlem süresi, bulunan QR kodları, her türlü hatalar ve verim dahil olmak üzere bir toplu özet görüntüler. Ardından her dosya adı ve çözülmüş URL'si listelenir.
10 test toplu QR kod giriş görüntüsünün tamamını indirin (batch-qr-images.zip).
ConcurrentBag<t>, kilit gerektirmeden tüm iş parçacıklarından sonuçları toplar. İş parçacığı-güvenli bir sayaç hataları izler ve her dosya için try-catch kullanmak, kötü bir görüntünün tüm partiyi kesintiye uğratmamasını sağlar. Bu yaklaşım, hata işleme nasıl yapılacağını açıklayan hata-izolasyon desenini takip eder.
CPU çekirdek sayısına uyacak şekilde MaxDegreeOfParallelism değerini Environment.ProcessorCount olarak ayarlayın. Ek iş parçacıkları kullanmak, üstyapıyı artırır ve performansı artırmaz, özellikle de CPU yoğunluklu ML modelleri için.
Async ve Paralel İşleme Kombine
Yüksek hacimli iş akışları için, eşzamanlılığı sınırlamak üzere SemaphoreSlim ile Task.WhenAll'yi birleştirin. Parallel.ForEach'den farklı olarak, bu model I/O'yu engelsiz tutarken aynı anda kaç kod çözme işleminin çalışacağını kontrol eder ve büyük iş yükleri altında iş parçacığı havuzunun doymasını önler.
Giriş
Eşzamanlı iş akışı tarafından işlenen yirmi QR kodu test görüntüsünden dördü. Her görüntü bir URL'yi kodlar ve SemaphoreSlim aracılığıyla sınırlı eşzamanlılık kullanılarak paralel olarak kod çözülür.
Görüntü 1 (Boru Hattı 1 of 20)
Görüntü 2 (Boru Hattı 2 of 20)
Görüntü 3 (Boru Hattı 3 of 20)
Görüntü 4 (Boru Hattı 4 of 20)
:path=/static-assets/qr/content-code-examples/how-to/async-and-multithreading/semaphore-pipeline.cs
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);
// OnlyDetectionModel: fastest per-image — critical at scale
var input = new QrImageInput(bmp, QrScanMode.OnlyDetectionModel);
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");
Imports IronQr
Imports IronQr.Enum
Imports IronSoftware.Drawing
Imports System.Collections.Concurrent
Imports System.Diagnostics
Module Program
Sub Main()
Dim files As String() = Directory.GetFiles("high-volume/", "*.png")
Dim results As New ConcurrentBag(Of (File As String, Value As String))()
Dim maxConcurrency As Integer = Environment.ProcessorCount
Using semaphore As New SemaphoreSlim(maxConcurrency)
Dim sw As Stopwatch = Stopwatch.StartNew()
Dim tasks = files.Select(Function(file) Task.Run(Async Function()
Await semaphore.WaitAsync()
Try
Dim bmp = AnyBitmap.FromFile(file)
' OnlyDetectionModel: fastest per-image — critical at scale
Dim input As New QrImageInput(bmp, QrScanMode.OnlyDetectionModel)
Dim qrResults = Await (New QrReader()).ReadAsync(input)
For Each qr In qrResults
results.Add((Path.GetFileName(file), qr.Value))
Next
Catch ex As Exception
Console.Error.WriteLine($"{{""file"":""{Path.GetFileName(file)}"",""error"":""{ex.Message}""}}")
Finally
semaphore.Release()
End Try
End Function))
Task.WhenAll(tasks).Wait()
sw.Stop()
Console.WriteLine($"Pipeline complete: {results.Count} QR codes from {files.Length} files in {sw.Elapsed.TotalSeconds:F1}s")
End Using
End Sub
End Module
Çıktı
Boru hattı bittiğinde, konsol bir özet görüntüler: toplam çözülen QR kodları sayısı, kaynak dosya sayısı ve geçen zaman, ardından her dosya adı ve çözülmüş URL'si.
20 test boru hattı QR kod giriş görüntüsünün tamamını indirin (high-volume-qr-images.zip).
Bant genişliği için semafor sınırını mevcut çekirdek sayısına uyacak şekilde ayarlayın veya büyük görüntülerle bellek baskısı olduğunda daha düşük ayarlayın.
Daha Fazla Okuma
- ML Tarama Örneği: kod numuneleriyle tarama modu karşılaştırması.
- QR Kodlarını Okuma Nasıl Yapılır: giriş yapısı ve temel okuma desenleri.
- QR Kodu Üreticisi Eğitimi: stil ile oluşturma.
- QrReader API Referansı: yöntem imzaları ve açıklamalar.
- QrWriter API Referansı: tüm yazma aşırı yükleri.
- Hata İşleme Nasıl Yapılır: dosya başına hata izolasyonu ve günlük tutma desenleri.
Sıkça Sorulan Sorular
C#'de asenkron QR kodu işlemenin amacı nedir?
C#'de asenkron QR kodu işleme, QR kodu işlemlerini ana iş parçacığını engellemeden gerçekleştirmenizi sağlar, IronQR'nin ReadAsync metodu gibi özellikleri kullanarak performansı ve yanıt vermeyi artırır.
Çoklu iş parçacığı QR kodu işlemeyi nasıl geliştirebilir?
Çoklu iş parçacığı, IronQR'yi kullanarak, aynı anda birden fazla işlemi çalıştırarak QR kodu işlemini önemli ölçüde iyileştirir, daha hızlı işlem süreleri ve geliştirilmiş uygulama verimliliği sağlar.
IronQR'daki ReadAsync metodu nedir?
IronQR'daki ReadAsync metodu, QR kodlarının asenkron okumasını etkinleştirir, C# uygulamanızın diğer görevleri geciktirmeden QR kodu verilerini işlemesine izin verir.
Parallel.ForEach, QR kodu işleme de nasıl yardımcı olur?
Parallel.ForEach, birden fazla QR kodunu aynı anda işlemek için görevleri birden çok iş parçacığına dağıtarak, IronQR ile verimli bir şekilde kullanılarak QR kodu işlemlerini hızlandırabilir.
SemaphoreSlim, QR kodu işlemlerinde hangi rolü oynar?
SemaphoreSlim, eşzamanlı görevlerin sayısını sınırlamak için kullanılır, IronQR ile QR kodlarının paralel işlenmesi sırasında kaynakları etkili bir şekilde yönetmeye yardımcı olur.
IronQR, sınırlandırılmış bir boru hattında QR kodlarını işlemek için kullanılabilir mi?
Evet, IronQR, eşzamanlılığı ve kaynak tahsisini etkili bir şekilde kontrol etmek için SemaphoreSlim gibi yapılar kullanarak sınırlandırılmış bir boru hattında QR kodlarını işlemek için kullanılabilir.
Asenkron QR kodu işlemleri için IronQR kullanmanın faydaları nelerdir?
Asenkron QR kodu işlemleri için IronQR kullanmak, uygulama yanıtını artırır, ana iş parçacığında engellemeyi azaltır ve büyük miktarda QR kodu verisini etkili bir şekilde yönetmenize olanak tanır.
IronQR kullanarak QR kodu işlemlerini paralel olarak çalıştırmak mümkün müdür?
Evet, IronQR, C#'deki çoklu iş parçacığı yeteneklerinden yararlanarak QR kodu işlemlerinin paralel işlenmesini destekler, daha hızlı ve daha verimli QR kodu yönetimi sağlar.
IronQR, C# uygulamalarında QR kodu işlemesini nasıl geliştirir?
IronQR, güçlü asenkron ve çoklu iş parçacığı yetenekleri sağlayarak QR kodu işleme sürelerini azaltır ve C# uygulamalarının ölçeklenebilirliğini artırır.
IronQR ile QR kodu işlemesi için C# özellikleri nelerdir?
Asenkron/await, Parallel.ForEach ve SemaphoreSlim gibi C# özellikleri IronQR'u tamamlar, etkili ve yüksek performanslı QR kodu işlemesi için bir çerçeve sağlar.

