# 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, bireysel okumaları beklenebilir bir göreve delege eder ve standart `Read` yöntemi, toplu işlem kapasitesi için `Parallel.ForEach` ve `Task.WhenAll` ile ç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.
*as-heading:2(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.
```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>Asgari İş Akışı (5 adım)</h3>
<ol>
<li><a class="js-modal-open" data-modal-id="trial-license-after-download" href="https://nuget.org/packages/IronQR/">Async QR kod işlemi için IronQR C# kütüphanesini indirin</a></li>
<li>Bloke olmayan tekli okumalar için <code>ReadAsync</code> kullanın</li>
<li>CPU tabanlı toplu işlem için <code>Parallel.ForEach</code> kullanın</li>
<li>Sınırlandırılmış eş zamanlılık boru hatları için <code>SemaphoreSlim</code> ile birleştirin</li>
<li><code>IEnumerable<QrResult></code> sonuçlarını toplayın ve çözülmüş değerleri yazdırın</li>
</ol>
</div>
## QR Kodlarını Eş Zamanlı Olarak Okuma
`ReadAsync` beklenebilir bir görev döndürür, bu da WPF/MAUI olay işleyicileri, ASP.NET denetleyici eylemleri veya herhangi bir zaman uyumsuz yöntem ile uyumlu yapar. 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 I/O sırasında ipliği engellememek için, kaydetme adımını `File.WriteAllBytesAsync()` ile, bit eşlemden alınan ham baytları kullanarak sarın.
### Giriş
Bir QR kod etkinlik rozeti, async okuma ve yazma desenini göstermek için tarandı ve yeniden oluşturuldu.
<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 kod kodlaması https://ironsoftware.com/event-badge, async okuma girişi olarak kullanıldı"
class="img-responsive add-shadow" />
</div>
</div>
```cs
:path=/static-assets/qr/content-code-examples/how-to/async-and-multithreading/async-read-write.cs
```
### Çıktı
Terminal, çözülmüş QR türünü ve değerini `[QrType] Value` formatında görüntüler, ardından `output-qr.png` kaydedildiğini onaylar.
<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="Terminal çıktısı, [QRCode] çözülmüş değerini ve output-qr.png kaydetme onayını gösteriyor" class="img-responsive add-shadow" />
</div>
</div>
`QrScanMode.Auto` hem ML tespitini hem de temel bir tarama geçişini çalıştırır, her sonuçta çözülmüş değeri ve QR türünü doldurur. `OnlyDetectionModel` daha hızlıdır ancak yalnızca çevresel kutu koordinatlarını döndürür, değer alanını boş bırakır. Kodlanmış içerik gerektiğinde `Auto` kullanın.
---
## QR Kodlarını Çoklu İş Parçacığı ile İşleme
Bağımsız olarak çözülebilen görüntüler için, `Parallel.ForEach` kullanılabilir CPU çekirdekleri arasında işi dağıtır. Her yineleme için ayrı bir `QrReader` örneği güvenli varsayılandır, çünkü IronQR, paylaşımlı okuyucu örnekleri için açık bir iplik güvenliği garantisi vermemektedir.
### Giriş
Paralel toplu taramada kullanılan on QR kod test görüntüsünden dördü. Her görüntü bir URL kodlar ve çalışma zamanında `qr-images/` klasöründen okunur.
<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 adresini kodlayan, 10 görüntüden 1'i olan toplu QR kod giriş görüntüsü"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Görüntü 1 (Toplu 1 of 10)
</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 adresini kodlayan, 10 görüntüden 2'si olan toplu QR kod giriş görüntüsü"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Görüntü 2 (Toplu 2 of 10)
</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 adresini kodlayan, 10 görüntüden 3'ü olan toplu QR kod giriş görüntüsü"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Görüntü 3 (Toplu 3 of 10)
</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 adresini kodlayan, 10 görüntüden 4'ü olan toplu QR kod giriş görüntüsü"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Görüntü 4 (Toplu 4 of 10)
</p>
</div>
</div>
```cs
:path=/static-assets/qr/content-code-examples/how-to/async-and-multithreading/parallel-batch.cs
```
### Çı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.
<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="Terminal çıktısı, paralel toplu sonuçları gösteriyor: 10 dosya işlendi, QR kodları bulundu, hatalar, verim ve dosya adı başına çözülen URL" class="img-responsive add-shadow" />
</div>
</div>
[10 test toplu QR kod giriş görüntüsünün tamamını indirin (batch-qr-images.zip).](/static-assets/qr/how-to/async-and-multithreading/batch-qr-images.zip)
`ConcurrentBag<t>` tüm ipliklerden sonuçları toplar ve kilitler gerektirmez. İş 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ı](/csharp/qr/how-to/detailed-error-messages) açıklayan hata-izolasyon desenini takip eder.
`MaxDegreeOfParallelism` ayarlayın `Environment.ProcessorCount` CPU çekirdek sayısı ile uyumlu olacak şekilde. 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 hatlar için, eşzamanlılığı sınırlandırmak amacıyla `SemaphoreSlim` ile `Task.WhenAll` eşleştirin. `Parallel.ForEach`'dan farklı olarak, bu desen, bir kerede kaç dekod çalıştığını kontrol ederken I/O'yu engellemez, büyük iş yükleri altında iplik havuzunun doygunluğunu önler.
### Giriş
Yirmi QR kodu test görüntüsünün dördü eşzamanlı hat tarafından işlendi. Her görüntü bir URL kodlar ve `SemaphoreSlim` ile sınırlı eşzamanlılık kullanılarak paralel olarak çözülür.
<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="Pipeline QR kodu giriş görüntüsü 1 / 20"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Görüntü 1 (Boru Hattı 1 of 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="Pipeline QR kodu giriş görüntüsü 2 / 20"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Görüntü 2 (Boru Hattı 2 of 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="Pipeline QR kodu giriş görüntüsü 3 / 20"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Görüntü 3 (Boru Hattı 3 of 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="Pipeline QR kodu giriş görüntüsü 4 / 20"
class="img-responsive add-shadow" style="max-width: 200px;" />
<p class="competitors__download-link" style="color: #181818; font-style: italic;">
Görüntü 4 (Boru Hattı 4 of 20)
</p>
</div>
</div>
```cs
:path=/static-assets/qr/content-code-examples/how-to/async-and-multithreading/semaphore-pipeline.cs
```
### Çı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.
<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="Terminal çıktısı, boru hattı sonuçlarını gösteriyor: 20 dosyadan 20 QR kodu çözüldü ve dosya adı başına çözülen URL" class="img-responsive add-shadow" />
</div>
</div>
[20 test boru hattı QR kod giriş görüntüsünün tamamını indirin (high-volume-qr-images.zip).](/static-assets/qr/how-to/async-and-multithreading/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](https://ironsoftware.com/csharp/qr/examples/read-qr-with-machine-learning/): kod numuneleriyle tarama modu karşılaştırması.
- [QR Kodlarını Okuma Nasıl Yapılır](https://ironsoftware.com/csharp/qr/how-to/read-qr-codes-from-image/): giriş yapısı ve temel okuma desenleri.
- [QR Kodu Üreticisi Eğitimi](https://ironsoftware.com/csharp/qr/tutorials/csharp-qr-code-generator/): stil ile oluşturma.
- [QrReader API Referansı](https://ironsoftware.com/csharp/qr/object-reference/api/IronQr.QrReader.html): yöntem imzaları ve açıklamalar.
- [QrWriter API Referansı](https://ironsoftware.com/csharp/qr/object-reference/api/IronQr.QrWriter.html): tüm yazma aşırı yükleri.
- [Hata İşleme Nasıl Yapılır](/csharp/qr/how-to/detailed-error-messages): dosya başına hata izolasyonu ve günlük tutma desenleri.
[Üretime hazır olduğunda lisans seçeneklerini görüntüleyin](https://ironsoftware.com/csharp/qr/licensing/).
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, bireysel okumaları beklenebilir bir göreve delege eder ve standart Read yöntemi, toplu işlem kapasitesi için Parallel.ForEach ve Task.WhenAll ile ç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.
1Install IronQR with NuGet Package Manager
PM > Install-Package IronQR
Install-Package IronQR
2Bu 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);
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#
3Canlı ortamınızda test için dağıtım yapın
Ücretsiz deneme ile bugün projenizde IronQR kullanmaya başlayın
Bloke olmayan tekli okumalar için ReadAsync kullanın
CPU tabanlı toplu işlem için Parallel.ForEach kullanın
Sınırlandırılmış eş zamanlılık boru hatları için SemaphoreSlim ile birleştirin
IEnumerable<QrResult> sonuçlarını toplayın ve çözülmüş değerleri yazdırın
QR Kodlarını Eş Zamanlı Olarak Okuma
ReadAsync beklenebilir bir görev döndürür, bu da WPF/MAUI olay işleyicileri, ASP.NET denetleyici eylemleri veya herhangi bir zaman uyumsuz yöntem ile uyumlu yapar. 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 I/O sırasında ipliği engellememek için, kaydetme adımını File.WriteAllBytesAsync() ile, bit eşlemden alınan ham baytları kullanarak sarın.
Giriş
Bir QR kod etkinlik rozeti, async okuma ve yazma desenini göstermek için tarandı ve yeniden oluşturuldu.
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();awaitFile.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#
Çıktı
Terminal, çözülmüş QR türünü ve değerini [QrType] Value formatında görüntüler, ardından output-qr.png kaydedildiğini onaylar.
QrScanMode.Auto hem ML tespitini hem de temel bir tarama geçişini çalıştırır, her sonuçta çözülmüş değeri ve QR türünü doldurur. OnlyDetectionModel daha hızlıdır ancak yalnızca çevresel kutu koordinatlarını döndürür, değer alanını boş bırakır. Kodlanmış içerik gerektiğinde Auto kullanın.
QR Kodlarını Çoklu İş Parçacığı ile İşleme
Bağımsız olarak çözülebilen görüntüler için, Parallel.ForEach kullanılabilir CPU çekirdekleri arasında işi dağıtır. Her yineleme için ayrı bir QrReader örneği güvenli varsayılandır, çünkü IronQR, paylaşımlı okuyucu örnekleri için açık bir iplik güvenliği garantisi vermemektedir.
Giriş
Paralel toplu taramada kullanılan on QR kod test görüntüsünden dördü. Her görüntü bir URL 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)
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<(stringFile, stringValue)>();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#
Çı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.
ConcurrentBag<t> tüm ipliklerden sonuçları toplar ve kilitler gerektirmez. İş 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.
MaxDegreeOfParallelism ayarlayın Environment.ProcessorCount CPU çekirdek sayısı ile uyumlu olacak şekilde. 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 hatlar için, eşzamanlılığı sınırlandırmak amacıyla SemaphoreSlim ile Task.WhenAll eşleştirin. Parallel.ForEach'dan farklı olarak, bu desen, bir kerede kaç dekod çalıştığını kontrol ederken I/O'yu engellemez, büyük iş yükleri altında iplik havuzunun doygunluğunu önler.
Giriş
Yirmi QR kodu test görüntüsünün dördü eşzamanlı hat tarafından işlendi. Her görüntü bir URL kodlar ve SemaphoreSlim ile sınırlı eşzamanlılık kullanılarak paralel olarak çö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)
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<(stringFile, stringValue)>();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(); }});awaitTask.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#
Çı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.
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ı.
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.
Curtis Chau, Bilgisayar Bilimleri alanında Lisans Derecesine (Carleton Üniversitesi) sahip ve Node.js, TypeScript, JavaScript ve React konularında uzmanlaşmış ön uç geliştirmeyle ilgileniyor. Sezgisel ve estetik açıdan hoş kullanıcı arayüzleri oluşturma tutkunu, Curtis modern çerçevelerle çalışmayı ve iyi yapılandırılmış, görsel olarak çekici kılavuzlar oluşturmayı seviyor.