Jak używać Async i Multithread w kodzie kreskowym używając C#

Jak korzystać z Async i Multithread w C# z IronBarcode

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

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 systemówych 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ą.

  1. Install IronBarcode with NuGet Package Manager

    PM > Install-Package BarCode
  2. Skopiuj i uruchom ten fragment kodu.

    var results = await IronBarCode.BarcodeReader.ReadAsync(imagePaths, new IronBarCode.BarcodeReaderOptions { Multithreaded = true, MaxParallelThreads = 4, ExpectMultipleBarcodes = true });
  3. Wdrożenie do testowania w środowisku produkcyjnym

    Rozpocznij używanie IronBarcode w swoim projekcie już dziś z darmową wersją próbną

    arrow pointer


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 języku C# należy używać słów kluczowych async i await w metodach obsługujących 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 odczytywać kody kreskowe asynchronicznie odpowiednio dla obrazów i dokumentów PDF. 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
$vbLabelText   $csharpLabel

Powyższy fragment kodu tworzy instancję List ścieżek obrazów, które mają być odczytywane asynchronicznie przez IronBarcode. Aby odczytać obrazy, należy użyć 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.

Ta metoda operacji asynchronicznej jest również dostępna do odczytu BARCODE-ów w dokumentach PDF poprzez 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:

  1. Aplikacje GUI: Aplikacje Windows Forms lub WPF wymagające responsywności interfejsu użytkownika. Async zapobiega zamarzaniu interfejsu podczas skanowania kodów kreskowych.

  2. 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.

  3. Przetwarzanie wsadowe: Selektywne odczytywanie wielu obrazów kodów kreskowych lub PDF-ów, pozwalając na wykonywanie innych zadań podczas operacji I/O.

  4. 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.

Dłączego 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:

  1. Zakleszczenia: Należy unikać Result lub Wait() w metodach asynchronicznych w kontekstach interfejsu użytkownika. W całym łańcuchu wywołań należy zawsze używać await.

  2. 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.

  3. Zmiana kontekstu: Rozważ użycie ConfigureAwait(false), gdy nie musisz wracać do pierwotnego kontekstu synchronizacji.

  4. 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 wykonywania za pomocą MaxParallelThreads w BarcodeReaderOptions. Domyślna wartość MaxParallelThreads wynosi 4 i można ją dostosować 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.

Zwróć uwagęAby znaleźć dostępne rdzenie: Menedżer zadań -> zakładka Wydajność -> kliknij CPU. (Pole "Cores" wyświetla liczbę.

: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
$vbLabelText   $csharpLabel

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

Przykład BARCODE UPC-A zawierający numer 0 123456 789012 do demonstracji wielowątkowego odczytu BARCODE-ów
Przykładowy BARCODE UPC-A z numerem 771234567003 do demonstracji wielowątkowego odczytu BARCODE'ów
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 systemówe

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:

  1. Operacje CPU-Bound: Przetwarzanie obejmuje ciężkie obliczenia, takie jak złożone filtry obrazów lub obrazy o wysokiej rozdzielczości
  2. Przetwarzanie wsadowe: Wiele niezależnych obrazów wymaga równoczesnego przetwarzania
  3. Systemy wielordzeniowe: Środowisko wdrożeniowe ma dostępne wiele rdzeni CPU
  4. Krytyczne pod względem wydajności: Szybkość przetwarzania surowego przewyższa efektywność zasobów

Wybierz operacje asynchroniczne, gdy:

  1. Operacje I/O-Bound: Większość czasu obejmuje odczytywanie plików lub oczekiwanie na odpowiedzi sieciowe
  2. Aplikacje UI: Utrzymanie responsywnych interfejsów użytkownika jest kluczowe
  3. Ograniczone zasoby: Uruchamianie na systemach z ograniczoną liczbą rdzeni CPU
  4. Aplikacje internetowe: Efektywna obsługa wielu równoczesnych żądań

Jak określić optymalną wartość MaxParallelThreads?

Optymalna wartość MaxParallelThreads zależy od kilku czynników:

  1. Dostępne rdzenie procesora: Zacznij od `` jako punktu odniesienia
  2. Typ obciążenia: Dla czystego odczytu kodów kreskowych użyj 75% dostępnych rdzeni
  3. Zasoby systemowe: Zostaw miejsce na system operacyjny i inne procesy
  4. 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);
int optimalThreads = Math.Max(1, Environment.ProcessorCount - 1);
$vbLabelText   $csharpLabel

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.

Jakie są korzyści z użycia IronBarcode do operacji na kodach kreskowych?

IronBarcode oferuje korzyści takie jak łatwość integracji, wsparcie dla wielu formatów kodów kreskowych, generowanie obrazów wysokiej jakości oraz solidne możliwości odczytu, co czyni go kompleksowym narzędziem do operacji na kodach kreskowych w C#.

Czy IronBarcode oferuje wsparcie dla dostosowywania wyglądu kodów kreskowych?

Tak, IronBarcode oferuje rozległe opcje dostosowywania wyglądu kodów kreskowych, w tym kolory, rozmiar i adnotacje tekstowe, pozwalając dostosować kody kreskowe do konkretnych wymagań projektowych.

Jak IronBarcode może pomóc w poprawie efektywności procesów biznesowych?

IronBarcode zwiększa efektywność procesów biznesowych, umożliwiając szybkie i dokładne generowanie i odczyt kodów kreskowych, redukując błędy ręcznego wprowadzania danych i poprawiając śledzenie zapasów i aktywów.

Jakie umiejętności programistyczne są potrzebne do zaimplementowania IronBarcode w projekcie?

Podstawowa znajomość programowania w C# jest wystarczająca do zaimplementowania IronBarcode w projekcie, ponieważ oferuje on nieskomplikowane metody i kompleksową dokumentację do prowadzenia deweloperów.

Czy IronBarcode jest odpowiedni zarówno dla małych projektów, jak i dużych aplikacji korporacyjnych?

IronBarcode jest zaprojektowany do bycia skalowalnym i wszechstronnym, dzięki czemu jest odpowiedni zarówno dla małych projektów, jak i dużych aplikacji korporacyjnych, które wymagają solidnych rozwiązań kodów kreskowych.

Hairil Hasyimi Bin Omar
Inżynier oprogramowania
Jak wszyscy wielcy inżynierowie, Hairil jest zapalonym uczniem. Doskonali swoją wiedzę na temat C#, Pythona i Javy, wykorzystując tę wiedzę, aby dodawać wartości członkom zespołu Iron Software. Hairil dołączył do zespołu Iron Software z Universiti Teknologi MARA w Malezji, gdzie uzyskał tytuł licencjata ...
Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 2,240,258 | Wersja: 2026.5 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package BarCode
uruchom przykład zobacz, jak twoje ciągi zamieniają się w kody kreskowe.