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.
Szybki start: Asynchroniczne i wielowątkowe przykład odczytu kodów kreskowych
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ą.
-
Install IronBarcode with NuGet Package Manager
PM > Install-Package BarCode -
Skopiuj i uruchom ten fragment kodu.
var results = await IronBarCode.BarcodeReader.ReadAsync(imagePaths, new IronBarCode.BarcodeReaderOptions { Multithreaded = true, MaxParallelThreads = 4, ExpectMultipleBarcodes = true }); -
Wdroż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żyj słów kluczowych async i await z metodami wspierającymi asynchroniczne funkcje. 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 do asynchronicznego czytania kodów kreskowych dla obrazów i dokumentów PDF, odpowiednio. Przed zainstalowaniem operacji async upewnij się, że zainstalowałeś IronBarcode przez NuGet w swoim projekcie.
:path=/static-assets/barcode/content-code-examples/how-to/async-multithread-async.cs
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 result
Fragment kodu powyżej tworzy listę ścieżek do obrazów, które mają być czytane asynchronicznie przez IronBarcode. Aby odczytać obrazy, użyj metody ReadAsync z klasy BarcodeReader. Określ imagePaths i opcje czytania. Dla zaawansowanych opcji konfiguracji zapoznaj się z naszym przewodnikiem po ustawieniach czytnika kodów kreskowych.
Ten sposób operacji asynchronicznej jest również dostępny do odczytu kodów kreskowych w dokumentach PDF za pośrednictwem ReadPdfAsync w tej samej klasie. W przypadku specyficznych konfiguracji czytania PDF zapoznaj się z naszym przewodnikiem ustawień czytnika kodów kreskowych w PDF.
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:
-
Zakleszczenia: Unikaj
ResultlubWait()na 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 oryginalnego 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 multithreading, ustawiając właściwość Multithreaded i określając maksymalną liczbę rdzeni do równoczesnego wykonania, używając MaxParallelThreads w BarcodeReaderOptions. Domyślna wartość MaxParallelThreads to 4, możliwa do dostosowania w zależności od dostępnych rdzeni procesora. Aby uzyskać optymalne ustawienia wydajności, zapoznaj się z naszym przewodnikiem po opcjach prędkości czytania.
:path=/static-assets/barcode/content-code-examples/how-to/async-multithread-multithread.cs
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 result
Jakiego 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 obciążające procesor: Przetwarzanie wymaga dużej mocy obliczeniowej, np. w przypadku złożonych filtrów obrazu lub obrazów o wysokiej rozdzielczości
- Przetwarzanie wsadowe: wiele niezależnych obrazów wymaga jednoczesnego przetwarzania
- Systemy wielordzeniowe: Środowisko wdrożeniowe ma do dyspozycji wiele rdzeni procesora
- Kluczowe znaczenie wydajności: Szybkość przetwarzania danych surowych przeważa nad efektywnością wykorzystania zasobów
Wybierz operacje asynchroniczne, gdy:
- Operacje związane z wejściem/wyjściem: Większość czasu zajmuje odczytywanie plików lub oczekiwanie na odpowiedzi sieciowe
- Aplikacje UI: Utrzymanie responsywnych interfejsów użytkownika ma kluczowe znaczenie
- Ograniczone zasoby: Działanie na systemach z ograniczoną liczbą rdzeni procesora
- 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 procesora: Rozpocznij od
Environment.ProcessorCountjako podstawy - Rodzaj obciążenia: W przypadku czystego odczytu BARCODE należy wykorzystać 75% dostępnych rdzeni
- Zasoby systemowe: Należy pozostawić rezerwę dla systemu operacyjnego i innych procesów
- Wyniki testów: Porównaj z konkretnym obciążeniem
Oto praktyczne podejście do znalezienia optymalnej wartości:
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
W ś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.

