Jak korzystać z Async i Multithread w C# z IronBarcode
Async i multithreading w IronBarcode optymalizują wydajność odczytu kodów kreskowych na różne sposoby - async zapobiega blokowaniu głównego wątku podczas operacji I/O, podczas gdy multithreading przetwarza wiele kodów kreskowych jednocześnie na rdzeniach CPU.
Programiści często mylą operacje Async i Multithreading. Obie metody zwiększają wydajność i efektywność programu poprzez optymalizację wykorzystania zasobów systemowych i skrócenie czasu działania. Różnią się jednak podejściem, mechanizmami i przypadkami użycia. IronBarcode obsługuje oba podejścia. Ten artykuł bada ich różnice i implementację przy użyciu IronBarcode.
Użyj tego przykładu jednowierszowego, aby szybko rozpocząć pracę z IronBarcode. Pokazuje, jak łatwo jest łączyć asynchroniczne czytanie i opcje multithreading, aby skanować wiele obrazów kodów kreskowych równolegle z minimalną konfiguracją.
-
1Install IronBarcode with NuGet Package Manager
-
2Skopiuj i uruchom ten fragment kodu.
var results = await IronBarCode.BarcodeReader.ReadAsync(imagePaths, new IronBarCode.BarcodeReaderOptions { Multithreaded = true, MaxParallelThreads = 4, ExpectMultipleBarcodes = true });C# -
3Wdrożenie do testowania w środowisku produkcyjnym
Rozpocznij używanie IronBarcode w swoim projekcie już dziś z darmową wersją próbną
Minimalny proces (5 kroków)
- Pobierz bibliotekę C# z obsługą async i multithread
- Użyj metod
ReadAsynciReadPdfAsyncdo asynchronicznego odczytu kodów kreskowych z obrazów i PDF-ów. - Włącz multithreading, ustawiając właściwość Multithreaded na 'true'.
- Określ licznik równoległych wątków, używając właściwości MaxParallelThreads.
- Sprawdź porównanie wydajności pomiędzy normalnym, asynchronicznym i wielowątkowym odczytem kodów kreskowych.
Jak czytać kody kreskowe asynchronicznie za pomocą IronBarcode?
Asynchroniczne czytanie umożliwia przeprowadzenie długich lub blokujących operacji bez blokowania wykonywania głównego wątku. W C# używaj słów kluczowych async i await z metodami obsługującymi funkcje asynchroniczne. To podejście nie tworzy dodatkowych wątków, lecz zwalnia bieżący wątek. Podczas gdy główny wątek rozpoczyna i zarządza zadaniami, nie pozostaje wyłącznie oddany jednemu zadaniu. Główny wątek zwraca się, kiedy metoda asynchroniczna wymaga jego zaangażowania, zwalniając go do obsługi innych zadań, gdy nie jest potrzebny - szczególnie przydatne dla zadań I/O, jak czytanie/zapisywanie plików czy wykonywanie żądań sieciowych.
Rozważ odczyt kodów kreskowych jako przykład. Proces obejmuje:
- Czytanie pliku
- Stosowanie opcji odczytu
- Dekodowanie kodu kreskowego
Podczas czytania pliku można zwolnić główne zadanie. To korzystne w scenariuszach z wieloma plikami obrazów lub dużymi PDF-ami, jak pokazano w naszym samouczku czytania kodów kreskowych.
Użyj metod ReadAsync i ReadPdfAsync, aby czytać kody kreskowe asynchronicznie dla obrazów i dokumentów PDF, odpowiednio. Przed zainstalowaniem operacji async upewnij się, że zainstalowałeś IronBarcode przez NuGet w swoim projekcie.
using IronBarCode;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
List<string> imagePaths = new List<string>() { "image1.png", "image2.png" };
// Barcode reading options
BarcodeReaderOptions options = new BarcodeReaderOptions()
{
ExpectMultipleBarcodes = true
};
// Read barcode using Async
BarcodeResults asyncResult = await BarcodeReader.ReadAsync(imagePaths, options);
// Print the results to console
foreach (var result in asyncResult)
{
Console.WriteLine(result.ToString());
}Imports IronBarCode
Imports System
Imports System.Collections.Generic
Imports System.Threading.Tasks
Private imagePaths As New List(Of String)() From {"image1.png", "image2.png"}
' Barcode reading options
Private options As New BarcodeReaderOptions() With {.ExpectMultipleBarcodes = True}
' Read barcode using Async
Private asyncResult As BarcodeResults = await BarcodeReader.ReadAsync(imagePaths, options)
' Print the results to console
For Each result In asyncResult
Console.WriteLine(result.ToString())
Next resultFragment kodu powyżej instancjuje List ścieżek obrazów do asynchronicznego odczytu przez IronBarcode. Aby odczytać obrazy, użyj metody ReadAsync z klasy BarcodeReader. Określ imagePaths i opcje odczytu. Dla zaawansowanych opcji konfiguracji zapoznaj się z naszym przewodnikiem po ustawieniach czytnika kodów kreskowych.
Ta metoda operacji asynchronicznej jest również dostępna do odczytu kodów kreskowych w dokumentach PDF za pomocą ReadPdfAsync w tej samej klasie. W przypadku specyficznych konfiguracji czytania PDF zapoznaj się z naszym przewodnikiem ustawień czytnika kodów kreskowych w PDF.
Multithreaded
MaxParallelThreads
Kiedy powinienem używać czytania asynchronicznego zamiast zwykłych metod?
Asynchroniczny odczyt wyróżnia się w kilku scenariuszach:
-
Aplikacje GUI: Aplikacje Windows Forms lub WPF wymagające responsywności interfejsu użytkownika. Async zapobiega zamarzaniu interfejsu podczas skanowania kodów kreskowych.
-
Aplikacje web: Aplikacje ASP.NET obsługujące wiele jednoczesnych żądań bez blokowania wątków, zwłaszcza podczas przetwarzania przesyłanych obrazów kodów kreskowych.
-
Przetwarzanie wsadowe: Selektywne odczytywanie wielu obrazów kodów kreskowych lub PDF-ów, pozwalając na wykonywanie innych zadań podczas operacji I/O.
-
Operacje sieciowe: Odczyt kodów kreskowych z zewnętrznych źródeł lub URL-i, jak pokazano w naszym przykładzie asynchronicznego odczytu kodów kreskowych z URL.
Dlaczego czytanie asynchroniczne poprawia responsywność aplikacji?
Asynchroniczny odczyt poprawia responsywność poprzez zwalnianie głównego wątku podczas operacji wiązanych z I/O. Kiedy IronBarcode odczytuje plik obrazu z dysku lub przetwarza plik PDF, wątek nie pozostaje w stanie bezczynności. Zamiast tego zajmuje się innymi zadaniami, takimi jak reagowanie na działania użytkownika lub przetwarzanie żądań. Jest to szczególnie widoczne w przypadku:
- Duże pliki graficzne wymagające znacznego czasu ładowania
- Pliki PDF zawierające wiele stron z BarCodes
- Sieciowe źródła obrazów
- Sytuacje wymagające zastosowania filtrów korekcji obrazu przed wykryciem BarCode
Jakie są typowe pułapki związane z asynchronicznym odczytem BarCodes?
Podczas wdrażania asynchronicznego odczytu BarCODE należy zwrócić uwagę na następujące typowe problemy:
-
Deadlocks: Unikaj
ResultlubWait()w metodach async w kontekstach UI. Zawsze używajawaitw całym łańcuchu wywołań. -
Obsługa wyjątków: Należy otaczać wywołania asynchroniczne blokami try-catch, ponieważ wyjątki w metodach asynchronicznych mogą nie propagować się zgodnie z oczekiwaniami.
-
Przełączanie kontekstu: Rozważ użycie
ConfigureAwait(false), gdy nie musisz wracać do pierwotnego kontekstu synchronizacji. -
Błędne przekonania dotyczące wydajności: Async nie przyspiesza poszczególnych operacji; poprawia responsywność aplikacji. Aby przyspieszyć działanie w przypadku wielu obrazów, warto rozważyć wielowątkowość.
W celu rozwiązywania problemów związanych z asynchronicznością zapoznaj się z naszym przewodnikiem dotyczącym rozwiązywania problemów z rozpoznawaniem kodów BarCode.
Jak włączyć wielowątkowe odczytywanie BarCode'ów?
W przeciwieństwie do operacji asynchronicznych, wielowątkowość polega na jednoczesnym wykonywaniu jednego procesu w wielu wątkach. Zamiast sekwencyjnego wykonywania w jednym wątku, wielowątkowość dzieli zadania między wiele wątków w celu ich równoczesnego wykonywania. Wielowątkowość wymaga wielu rdzeni procesora, ponieważ rdzenie te niezależnie wykonują wątki. Podobnie jak operacje asynchroniczne, wielowątkowość poprawia wydajność i responsywność aplikacji.
W IronBarcode włącz wielowątkowość, ustawiając właściwość Multithreaded i określając maksymalną liczbę rdzeni do równoczesnego wykonania za pomocą MaxParallelThreads w BarcodeReaderOptions. Domyślna wartość MaxParallelThreads to 4, regulowana w oparciu o dostępne rdzenie CPU. Aby uzyskać optymalne ustawienia wydajności, zapoznaj się z naszym przewodnikiem po opcjach prędkości czytania.
using IronBarCode;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
List<string> imagePaths = new List<string>(){"test1.jpg", "test2.png"};
// Barcode reading options
BarcodeReaderOptions options = new BarcodeReaderOptions()
{
Multithreaded = true,
MaxParallelThreads = 4,
ExpectMultipleBarcodes = true
};
// Read barcode with multithreaded enabled
BarcodeResults results = BarcodeReader.Read(imagePaths, options);
// Print the results to console
foreach (var result in results)
{
Console.WriteLine(result.ToString());
}Imports IronBarCode
Imports System
Imports System.Collections.Generic
Imports System.Threading.Tasks
Private imagePaths As New List(Of String)() From {"test1.jpg", "test2.png"}
' Barcode reading options
Private options As New BarcodeReaderOptions() With {
.Multithreaded = True,
.MaxParallelThreads = 4,
.ExpectMultipleBarcodes = True
}
' Read barcode with multithreaded enabled
Private results As BarcodeResults = BarcodeReader.Read(imagePaths, options)
' Print the results to console
For Each result In results
Console.WriteLine(result.ToString())
Next resultJakiego wzrostu wydajności mogę się spodziewać?
Przeanalizujmy dwa przykładowe obrazy i porównajmy czasy odczytu w przypadku operacji normalnych, asynchronicznych i wielowątkowych.
Przykładowy obrazek


| Normalny tekst | Odczyt asynchroniczny | Odczyt wielowątkowy (4 rdzenie) |
|---|---|---|
| 01,75 sekundy | 01,67 sekundy | 01,17 sekundy |
Porównanie pokazuje znaczny wzrost wydajności dzięki asynchronicznemu i wielowątkowemu odczytowi. Wielowątkowość zapewnia około 33% poprawę w stosunku do normalnego odczytu, podczas gdy asynchroniczność zapewnia około 5% poprawy. Jednak operacje te służą różnym celom i opierają się na różnych podejściach. Wybierz podejście, które najlepiej odpowiada wymaganiom Twojej aplikacji.
Poprawa wydajności zależy od:
- Liczba przetworzonych obrazów
- Złożoność obrazu i jakość BARCODE
- Dostępne rdzenie procesora
- Inne zasoby systemowe
W przypadku sytuacji, w których na jednym dokumencie znajduje się wiele BARCODE-ów, zapoznaj się z przewodnikiem Odczytywanie wielu BARCODE-ów.
Kiedy należy wybrać wielowątkowość zamiast operacji asynchronicznych?
Wybierz wielowątkowość, gdy:
- Operacje CPU-Bound: Przetwarzanie obejmuje ciężkie obliczenia, takie jak złożone filtry obrazów lub obrazy o wysokiej rozdzielczości
- Przetwarzanie wsadowe: Wiele niezależnych obrazów wymaga równoczesnego przetwarzania
- Systemy wielordzeniowe: Środowisko wdrożeniowe ma dostępne wiele rdzeni CPU
- Krytyczne pod względem wydajności: Szybkość przetwarzania surowego przewyższa efektywność zasobów
Wybierz operacje asynchroniczne, gdy:
- Operacje I/O-Bound: Większość czasu obejmuje odczytywanie plików lub oczekiwanie na odpowiedzi sieciowe
- Aplikacje UI: Utrzymanie responsywnych interfejsów użytkownika jest kluczowe
- Ograniczone zasoby: Uruchamianie na systemach z ograniczoną liczbą rdzeni CPU
- Aplikacje internetowe: Efektywna obsługa wielu równoczesnych żądań
Jak określić optymalną wartość MaxParallelThreads?
Optymalna wartość MaxParallelThreads zależy od kilku czynników:
- Dostępne rdzenie CPU: Zacznij od
Environment.ProcessorCountjako podstawy - Typ obciążenia: Dla czystego odczytu kodów kreskowych użyj 75% dostępnych rdzeni
- Zasoby systemowe: Zostaw miejsce na system operacyjny i inne procesy
- Wyniki testów: Przeprowadź testy z twoim specyficznym obciążeniem
Oto praktyczne podejście do znalezienia optymalnej wartości:
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);netW środowiskach produkcyjnych należy monitorować wydajność i dostosowywać ją w oparciu o rzeczywiste wzorce użytkowania. Rozważ wdrożenie konfiguracji klucza licencyjnego w przypadku wdrożeń Enterprise wymagających maksymalnej wydajności.
Aby zapoznać się z pełnym zakresem możliwości API, należy skorzystać z Dokumentacji API IronBarcode.
Często Zadawane Pytania
Jaka jest różnica między asynchronicznością a wielowątkowością podczas odczytu kodów kreskowych?
Z IronBarcode, operacje async zapobiegają blokowaniu głównego wątku podczas zadań I/O, takich jak odczyt plików, podczas gdy wielowątkowość pozwala na przetwarzanie wielu kodów jednocześnie na rdzeniach CPU. Async używa słów kluczowych async/await do zwolnienia głównego wątku podczas długich operacji, natomiast wielowątkowość tworzy wiele wątków do równoległego przetwarzania kodów.
Jak zaimplementować asynchroniczne odczytywanie kodów kreskowych w C#?
IronBarcode dostarcza metody ReadAsync() i ReadPdfAsync() do asynchronicznego odczytywania kodów kreskowych. Wystarczy użyć tych metod ze słowami kluczowymi async/await w C#, aby odczytywać kody z obrazów i PDF bez blokowania głównego wątku. Jest to szczególnie przydatne przy przetwarzaniu wielu plików obrazów lub dużych dokumentów PDF.
Jak mogę włączyć wielowątkowość do przetwarzania kodów kreskowych?
Aby włączyć wielowątkowość w IronBarcode, ustaw właściwość Multithreaded na 'true' w BarcodeReaderOptions. Możesz również kontrolować liczbę wątków równoległych, używając właściwości MaxParallelThreads, co pozwala na optymalizację wydajności w oparciu o możliwości systemu.
Czy mogę połączyć async i wielowątkowość dla optymalnej wydajności?
Tak, IronBarcode pozwala na połączenie obu podejść. Możesz używać ReadAsync() z włączoną wielowątkowością, ustawiając Multithreaded = true i konfigurując MaxParallelThreads w BarcodeReaderOptions. Ta kombinacja zapewnia zarówno nieblokujące operacje I/O, jak i równoległe przetwarzanie na wielu rdzeniach CPU.
Kiedy powinienem używać async w porównaniu do wielowątkowości dla odczytywania kodów kreskowych?
Używaj operacji async w IronBarcode, gdy masz do czynienia z zadaniami związanymi z I/O, takimi jak odczyt dużych plików lub wykonywanie zapytań sieciowych, ponieważ zapobiega to zawieszaniu się interfejsu użytkownika. Używaj wielowątkowości, gdy musisz jednocześnie przetwarzać wiele kodów i masz dostępne zasoby CPU. Dla najlepszych wyników, łącz oba podejścia przy przetwarzaniu wielu dużych obrazów kodów kreskowych lub PDF.
What factors affect the optimal 'MaxParallelThreads' setting in IronBarcode?
The optimal 'MaxParallelThreads' value is influenced by available CPU cores, workload type, overall system resources, and testing results. A practical starting point is to use one less than the total available CPU cores.
How does IronBarcode's async functionality improve application responsiveness?
Async functionality in IronBarcode increases application responsiveness by freeing the main thread during long I/O-bound barcode reading tasks, allowing the application to handle other processes concurrently, such as user interface updates.
What are the advantages of using multithreading in barcode reading?
Multithreading allows simultaneous processing of multiple images, which enhances performance in CPU-bound operations such as processing complex image filters or high-resolution images. This is beneficial in environments with multiple CPU cores.
How can I implement license key configuration for optimal performance in IronBarcode?
For enterprise deployments requiring maximum performance, consider implementing license key configuration. This can be done by following IronBarcode's documentation on license key settings to fully unlock features and optimize resource utilization.
What are the key differences between async and multithreading in IronBarcode?
Async in IronBarcode prevents blocking the main thread during I/O operations, ideal for file and network tasks, whereas multithreading divides tasks among threads for concurrent execution across CPU cores, improving performance in CPU-bound operations.
