Maximale parallele Threads einstellen

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

Beim Lesen großer Mengen von Barcodes kann die Verwendung eines Single-Thread-Prozesses zu Leistungsengpässen führen und die Skalierbarkeit einschränken. Durch die Verwendung paralleler Threads kann Ihre Anwendung jedoch mehrere Bilder gleichzeitig verarbeiten, wodurch sich die Gesamtverarbeitungsleistung effektiv vervielfacht und die Zeit, die für die Ausführung eines Stapelauftrags benötigt wird, drastisch verkürzt.

Die Festlegung einer Höchstgrenze für diese Threads ist ein wirksames Mittel zur Leistungsoptimierung. Sie stellt sicher, dass die Anwendung das volle Potenzial der Hardware ausschöpft, indem sie die Arbeitslast auf die Prozessorkerne verteilt. Dieser Ansatz maximiert die Effizienz und sorgt dafür, dass die Anwendung reibungslos läuft, während gleichzeitig die schnellstmöglichen Ergebnisse erzielt werden.

IronBarcode bietet eine einfache Möglichkeit, diese Grenze zu kontrollieren und so eine optimale Maschinenleistung zu gewährleisten. Im folgenden Abschnitt wird gezeigt, wie Sie diese Thread-Grenzen einfach festlegen können.



Max. parallele Threads einstellen

In diesem Beispiel werden wir einen großen Satz von Barcode-Bildern verwenden, um die Skalierbarkeit und Effizienz der Verwendung eines Multi-Thread-Prozesses anstelle eines Single-Thread-Prozesses zu veranschaulichen. Sie können den Bildordner hier herunterladen.

Um IronBarcode so zu konfigurieren, dass mehr als ein Thread verwendet wird, wird zunächst ein neues BarcodeReaderOptions-Objekt instanziiert und Multithreaded auf true gesetzt. Anschließend wird die Eigenschaft MaxParallelThreads durch Zuweisung eines ganzzahligen Werts festgelegt. Standardmäßig ist MaxParallelThreads auf 4 eingestellt.

Nach dem Konfigurieren der Einstellungen wird eine große Anzahl von Barcode-Bildern aus dem Ordner importiert. In einer Schleife wird dann das Verzeichnis der Barcode-Bilder mit der Methode Read gelesen, wobei der Dateipfad und die konfigurierten BarcodeReaderOptions übergeben werden. Schließlich werden der BarCode-Wert und -Typ durch Zugriff auf die BarcodeResults angezeigt.

:path=/static-assets/barcode/content-code-examples/how-to/set-max-parallel-thread.cs
using IronBarCode;
using System;
using System.IO;

int maxParallelThreads = 4;


var optionsFaster = new BarcodeReaderOptions
{
    // Set Max threads to 4
    Multithreaded = true,
    MaxParallelThreads = maxParallelThreads,
};

// Dynamically get the "images" folder in the current directory
string folderPath = Path.Combine(Directory.GetCurrentDirectory(), "images");

// Retrieve all JPG files in the directory
var pdfFiles = Directory.GetFiles(folderPath, "*.jpg");

foreach (var file in pdfFiles)
{
    // Read the barcode
    var results = BarcodeReader.Read(file);

    foreach (var result in results)
    {
        // Show the type and value for every barcode found
        Console.WriteLine($"Value: {result.Value}, Type: {result.BarcodeType}");
            
    }
    
}

Imports IronBarCode
Imports System
Imports System.IO

Dim maxParallelThreads As Integer = 4

Dim optionsFaster As New BarcodeReaderOptions With {
    .Multithreaded = True,
    .MaxParallelThreads = maxParallelThreads
}

' Dynamically get the "images" folder in the current directory
Dim folderPath As String = Path.Combine(Directory.GetCurrentDirectory(), "images")

' Retrieve all JPG files in the directory
Dim pdfFiles = Directory.GetFiles(folderPath, "*.jpg")

For Each file In pdfFiles
    ' Read the barcode
    Dim results = BarcodeReader.Read(file)

    For Each result In results
        ' Show the type and value for every barcode found
        Console.WriteLine($"Value: {result.Value}, Type: {result.BarcodeType}")
    Next
Next
$vbLabelText   $csharpLabel

Ausgabe

Multithreading-Ausgabe

Wie in der Konsolenausgabe zu sehen ist, werden der Barcodewert und -typ für jedes entsprechende Bild angezeigt.

Einstellung des geeigneten maximalen parallelen Threads

Wenn die Multithreaded-Eigenschaft auf true gesetzt ist, ist die MaxParallelThreads-Eigenschaft standardmäßig auf 4 gesetzt. Obwohl es keine feste Grenze für die ganze Zahl gibt, die MaxParallelThreads zugewiesen ist, kann das Setzen des Wertes auf einen höheren Wert als die logische Kernkapazität Ihrer Hardware tatsächlich zu einem Leistungsabfall führen. Der Grund dafür ist, dass der Prozessor nicht mit übermäßigen Kontextwechseln umgehen kann, was möglicherweise eher zu Overhead als zu Geschwindigkeit führt. Der richtige Wert fürMaxParallelThreads hängt von den Spezifikationen des Computers ab, und Entwickler sollten testen, um den optimalen Wert für ihre Umgebung zu finden.

In diesem Beispiel wird dasselbe Multi-Thread-Szenario wie oben gezeigt, jedoch mit einem Timer, um den Standardwert von 4 mit der Verwendung von Environment.ProcessorCount zu vergleichen, um alle verfügbaren Threads zu nutzen. In unserem Fall verwenden wir einen Computer mit 32 logischen Prozessoren, also wird MaxParallelThreads auf 32 gesetzt.

:path=/static-assets/barcode/content-code-examples/how-to/set-max-parallel-thread-performance.cs
using IronBarCode;
using System;
using System.Diagnostics;
using System.IO;
using System.Linq;

// Set the max parallel threads to the number of processor cores
int maxParallelThreads = Environment.ProcessorCount;


var optionsFaster = new BarcodeReaderOptions
{
    // Set Max threads to the number of processor cores
    Multithreaded = true,
    MaxParallelThreads = maxParallelThreads,
    ExpectMultipleBarcodes = true,
};

// Start timing the process
var stopwatch = Stopwatch.StartNew();
// Dynamically get the "images" folder in the current directory
string folderPath = Path.Combine(Directory.GetCurrentDirectory(), "images");

// Check if directory exists to prevent crashes
if (!Directory.Exists(folderPath))
{
    Console.WriteLine($"Error: The directory '{folderPath}' does not exist.");
    return;
}

// Get all JPG files in the directory
var pdfFiles = Directory.GetFiles(folderPath, "*.jpg");

foreach (var file in pdfFiles)
{
    // Read the barcode
    var results = BarcodeReader.Read(file);

    if (results.Any())
    {
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}");
        foreach (var result in results)
        {
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}");
            
        }
    }
}

stopwatch.Stop();

// Print number of images the barcode reader could decode
Console.WriteLine($" Max parallel threads of {maxParallelThreads} with {stopwatch.Elapsed.TotalSeconds:F2}s");
Imports IronBarCode
Imports System
Imports System.Diagnostics
Imports System.IO
Imports System.Linq

' Set the max parallel threads to the number of processor cores
Dim maxParallelThreads As Integer = Environment.ProcessorCount

Dim optionsFaster As New BarcodeReaderOptions With {
    .Multithreaded = True,
    .MaxParallelThreads = maxParallelThreads,
    .ExpectMultipleBarcodes = True
}

' Start timing the process
Dim stopwatch As Stopwatch = Stopwatch.StartNew()
' Dynamically get the "images" folder in the current directory
Dim folderPath As String = Path.Combine(Directory.GetCurrentDirectory(), "images")

' Check if directory exists to prevent crashes
If Not Directory.Exists(folderPath) Then
    Console.WriteLine($"Error: The directory '{folderPath}' does not exist.")
    Return
End If

' Get all JPG files in the directory
Dim pdfFiles As String() = Directory.GetFiles(folderPath, "*.jpg")

For Each file As String In pdfFiles
    ' Read the barcode
    Dim results = BarcodeReader.Read(file)

    If results.Any() Then
        Console.WriteLine($"Barcode(s) found in: {Path.GetFileName(file)}")
        For Each result In results
            Console.WriteLine($"  Value: {result.Value}, Type: {result.BarcodeType}")
        Next
    End If
Next

stopwatch.Stop()

' Print number of images the barcode reader could decode
Console.WriteLine($" Max parallel threads of {maxParallelThreads} with {stopwatch.Elapsed.TotalSeconds:F2}s")
$vbLabelText   $csharpLabel

Ausgabe

Bearbeitungszeit mit 4 Threads

4 Prozessor

Die Bearbeitungszeit für diesen Prozess beträgt 84 Sekunden.

Bearbeitungszeit mit Environment ProcessorCount

32 Prozessor

Wie Sie sehen können, beträgt die Verarbeitungszeit für diesen Vorgang 53 Sekunden, was deutlich schneller ist als die Ausführung mit nur vier Threads. Bitte beachten Sie jedoch, dass die Verwendung von mehr Threads keine Garantie für eine bessere Leistung ist, da diese vom Host-Prozessor abhängt. Als Faustregel gilt, dass die maximale Anzahl der verfügbaren Prozessoren minus einen verwendet werden sollte, um sicherzustellen, dass noch ein einzelner Thread für andere Systemoperationen zur Verfügung steht.

Warnung Die Projektumgebung muss so konfiguriert sein, dass Multithreading möglich ist. Andernfalls wird das Setzen von Multithreaded auf true und das Erhöhen von MaxParallelThreads die Prozessgeschwindigkeit nicht verbessern, sondern möglicherweise sogar verringern.

Häufig gestellte Fragen

Welchen Zweck erfüllt die Einstellung der maximalen Anzahl paralleler Threads in IronBarcode?

Die Einstellung der maximalen Anzahl paralleler Threads ermöglicht es Ihnen, die Leistung der Barcode-Generierung durch effiziente Nutzung der Systemressourcen zu optimieren, insbesondere bei der Verarbeitung einer großen Anzahl von Barcodes in Massen.

Wie kann ich die maximale Anzahl paralleler Threads in IronBarcode konfigurieren?

Sie können die maximale Anzahl paralleler Threads in IronBarcode konfigurieren, indem Sie die entsprechende Methode in Ihrem C#-Code verwenden, um die gewünschte Anzahl von Threads für Barcode-Generierungsaufgaben festzulegen.

Warum ist es wichtig, die Leistung bei der Erstellung von Massenbarcodes zu optimieren?

Die Optimierung der Leistung für die Erstellung von Massenbarcodes stellt sicher, dass der Prozess effizient und schnell abläuft, wodurch der Zeit- und Ressourcenaufwand für die Erzeugung einer großen Menge von Barcodes reduziert wird, was für Anwendungen mit hohen Durchsatzanforderungen unerlässlich ist.

Was sind die Vorteile der Parallelverarbeitung in IronBarcode?

Die parallele Verarbeitung in IronBarcode ermöglicht eine schnellere Barcode-Erzeugung durch die Nutzung mehrerer CPU-Kerne, was zu einer verbesserten Anwendungsleistung und kürzeren Verarbeitungszeiten für umfangreiche Barcode-Aufgaben führt.

Kann sich die Einstellung zu vieler paralleler Threads negativ auf die Leistung auswirken?

Ja, das Einrichten zu vieler paralleler Threads kann zu Ressourcenkonflikten und erhöhtem Overhead führen, was die Leistung beeinträchtigen kann. Es ist wichtig, eine ausgewogene Konfiguration zu finden, die den Fähigkeiten Ihres Systems entspricht.

Welche Überlegungen sollten bei der Auswahl der Anzahl der parallelen Threads angestellt werden?

Berücksichtigen Sie die Anzahl der verfügbaren CPU-Kerne, die Arbeitslast des Systems und die Art Ihrer Aufgaben zur Strichcodeerstellung. Es ist am besten, mit verschiedenen Einstellungen zu experimentieren, um die optimale Konfiguration zu finden.

Gibt es eine Standardeinstellung für parallele Threads in IronBarcode?

IronBarcode verfügt zwar über eine Standardeinstellung für parallele Threads, es wird jedoch empfohlen, diese Einstellung auf der Grundlage Ihrer spezifischen Anwendungsanforderungen anzupassen, um die beste Leistung zu erzielen.

Wie handhabt IronBarcode das Thread-Management?

IronBarcode for .NET nutzt die Threading-Fähigkeiten von .NET, um die parallele Verarbeitung zu verwalten und ermöglicht es Entwicklern, die Anzahl der Threads festzulegen, um die Leistung effektiv zu optimieren.

Kann ich die Anzahl der parallelen Threads während der Ausführung dynamisch ändern?

Es ist nicht empfehlenswert, die Anzahl der parallelen Threads während der Ausführung dynamisch zu ändern, da dies zu Inkonsistenzen führen und die Leistungsstabilität beeinträchtigen kann. Es ist am besten, die Konfiguration vor dem Start der Barcode-Generierung festzulegen.

Was sind häufige Anwendungsfälle für die Einstellung der maximalen Anzahl paralleler Threads bei der Barcode-Generierung?

Häufige Anwendungsfälle sind Anwendungen, die eine schnelle Barcode-Erzeugung erfordern, wie z. B. Bestandsverwaltungssysteme, Kassensysteme im Einzelhandel und Logistikanwendungen, bei denen die schnelle Verarbeitung großer Mengen von Barcodes entscheidend ist.

Curtis Chau
Technischer Autor

Curtis Chau hat einen Bachelor-Abschluss in Informatik von der Carleton University und ist spezialisiert auf Frontend-Entwicklung mit Expertise in Node.js, TypeScript, JavaScript und React. Leidenschaftlich widmet er sich der Erstellung intuitiver und ästhetisch ansprechender Benutzerschnittstellen und arbeitet gerne mit modernen Frameworks sowie der Erstellung gut strukturierter, optisch ansprechender ...

Weiterlesen
Bereit anzufangen?
Nuget Downloads 2,070,733 | Version: 2026.2 gerade veröffentlicht