Przejdź do treści stopki
POMOC .NET

C# Parallel Foreach (Jak to działa dla deweloperów)

Czym jest Parallel.ForEach w C#?

Parallel.ForEach to metoda w C#, która pozwala na równoległe iteracje w kolekcji lub źródle danych. Zamiast przetwarzać każdy element w kolekcji sekwencyjnie, pętla równoległa umożliwia współbieżne wykonanie, co może znacząco poprawić wydajność poprzez skrócenie całkowitego czasu wykonania. Przetwarzanie równoległe działa przez podział pracy na wiele procesorów rdzeniowych, co pozwala na jednoczesne wykonywanie zadań. Jest to szczególnie przydatne przy przetwarzaniu zadań, które są od siebie niezależne.

W przeciwieństwie do zwykłej pętli foreach, która przetwarza elementy sekwencyjnie, podejście równoległe może obsługiwać duże zestawy danych znacznie szybciej, wykorzystując wiele wątków jednocześnie.

Dlaczego używać przetwarzania równoległego z IronPDF?

IronPDF to potężna biblioteka do obsługi PDF-ów w .NET, zdolna do konwertowania HTML na PDF, wydobywania tekstu z PDF-ów, scalania i dzielenia dokumentów i nie tylko. Podczas pracy z dużą ilością zadań PDF, użycie przetwarzania równoległego z Parallel.ForEach może znacznie skrócić czas wykonania. Niezależnie od tego, czy generujesz setki PDF-ów, czy też wydobywasz dane z wielu plików jednocześnie, wykorzystanie równoległej obróbki danych z IronPDF zapewnia, że zadania są wykonywane szybciej i bardziej efektywnie.

Ten przewodnik jest przeznaczony dla programistów .NET, którzy chcą zoptymalizować swoje zadania przetwarzania PDF z użyciem IronPDF i Parallel.ForEach. Zalecana jest podstawowa znajomość C# oraz znajomość biblioteki IronPDF. Na końcu tego przewodnika będziesz w stanie zaimplementować przetwarzanie równoległe, aby obsługiwać wiele zadań PDF jednocześnie, poprawiając zarówno wydajność, jak i skalowalność.

Pierwsze kroki

Instalacja IronPDF

Aby użyć IronPDF w swoim projekcie, musisz zainstalować bibliotekę za pośrednictwem NuGet.

Instalacja pakietu NuGet

Aby zainstalować IronPDF, postępuj zgodnie z następującymi krokami:

  1. Otwórz swój projekt w Visual Studio.
  2. Przejdź do NarzędziaMenedżer pakietów NuGetZarządzaj pakietami NuGet dla rozwiązania.
  3. Wyszukaj IronPDF w menedżerze pakietów NuGet.

C# Parallel Foreach (How it Works for Developers): Rysunek 1

  1. Kliknij Zainstaluj, aby dodać bibliotekę IronPDF do swojego projektu.

C# Parallel Foreach (How it Works for Developers): Rysunek 2

Alternatywnie można zainstalować ją za pośrednictwem konsoli Menedżera pakietów NuGet:

Install-Package IronPdf

Po zainstalowaniu IronPDF jesteś gotowy do jej używania do generowania i manipulacji PDF-ami.

Podstawowe pojęcia dotyczące Parallel.ForEach w C

Parallel.ForEach jest częścią przestrzeni nazw System.Threading.Tasks i zapewnia prosty i efektywny sposób na równoczesne wykonywanie iteracji. Składnia dla Parallel.ForEach jest następująca:

Parallel.ForEach(collection, item =>
{
    // Code to process each item
});
Parallel.ForEach(collection, item =>
{
    // Code to process each item
});
Parallel.ForEach(collection, Sub(item)
	' Code to process each item
End Sub)
$vbLabelText   $csharpLabel

Każdy element w kolekcji jest przetwarzany równolegle, a system decyduje, jak podzielić obciążenie między dostępne wątki. Możesz również określić opcje kontrolowania stopnia równoległości, takie jak maksymalna liczba używanych wątków.

W porównaniu, tradycyjna pętla foreach przetwarza każdy element jeden po drugim, podczas gdy pętla równoległa może przetwarzać wiele elementów równocześnie, poprawiając wydajność podczas obsługi dużych kolekcji.

Wdrożenie krok po kroku

Konfiguracja projektu

Po pierwsze, upewnij się, że IronPDF jest zainstalowany zgodnie z opisem w sekcji Pierwsze Kroki. Po tym możesz zacząć pisać swoją logikę przetwarzania równoległego dla PDF-ów.

Tworzenie logiki przetwarzania równoległego

Fragment kodu: Używanie Parallel.ForEach do konwersji HTML na PDF

string[] htmlFiles = { "page1.html", "page2.html", "page3.html" };
Parallel.ForEach(htmlFiles, htmlFile =>
{
    // Load the HTML content into IronPDF and convert it to PDF
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlFile);
    // Save the generated PDF to the output folder
    pdf.SaveAs($"output_{htmlFile}.pdf");
});
string[] htmlFiles = { "page1.html", "page2.html", "page3.html" };
Parallel.ForEach(htmlFiles, htmlFile =>
{
    // Load the HTML content into IronPDF and convert it to PDF
    ChromePdfRenderer renderer = new ChromePdfRenderer();
    PdfDocument pdf = renderer.RenderHtmlAsPdf(htmlFile);
    // Save the generated PDF to the output folder
    pdf.SaveAs($"output_{htmlFile}.pdf");
});
Dim htmlFiles() As String = { "page1.html", "page2.html", "page3.html" }
Parallel.ForEach(htmlFiles, Sub(htmlFile)
	' Load the HTML content into IronPDF and convert it to PDF
	Dim renderer As New ChromePdfRenderer()
	Dim pdf As PdfDocument = renderer.RenderHtmlAsPdf(htmlFile)
	' Save the generated PDF to the output folder
	pdf.SaveAs($"output_{htmlFile}.pdf")
End Sub)
$vbLabelText   $csharpLabel

Ten kod pokazuje, jak konwertować wiele stron HTML na PDF w trybie równoległym.

Obsługa błędów w przetwarzaniu równoległym

Podczas pracy z zadaniami równoległymi, obsługa błędów jest kluczowa. Użyj bloków try-catch wewnątrz pętli Parallel.ForEach, aby zarządzać wszelkimi wyjątkami.

Fragment kodu: Obsługa błędów w zadaniach równoległych PDF

Parallel.ForEach(pdfFiles, pdfFile =>
{
    try
    {
        var pdf = IronPdf.PdfDocument.FromFile(pdfFile);
        string text = pdf.ExtractAllText();
        System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error processing {pdfFile}: {ex.Message}");
    }
});
Parallel.ForEach(pdfFiles, pdfFile =>
{
    try
    {
        var pdf = IronPdf.PdfDocument.FromFile(pdfFile);
        string text = pdf.ExtractAllText();
        System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text);
    }
    catch (Exception ex)
    {
        Console.WriteLine($"Error processing {pdfFile}: {ex.Message}");
    }
});
Parallel.ForEach(pdfFiles, Sub(pdfFile)
	Try
		Dim pdf = IronPdf.PdfDocument.FromFile(pdfFile)
		Dim text As String = pdf.ExtractAllText()
		System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text)
	Catch ex As Exception
		Console.WriteLine($"Error processing {pdfFile}: {ex.Message}")
	End Try
End Sub)
$vbLabelText   $csharpLabel

Praktyczne przypadki użycia z pełnymi przykładami kodu

Wydobywanie tekstu z wielu PDF-ów jednocześnie

Kolejnym przypadkiem użycia przetwarzania równoległego jest wydobywanie tekstu z partii PDF-ów. Podczas pracy z wieloma plikami PDF równoczesne wydobywanie tekstu może zaoszczędzić dużo czasu. Poniższy przykład pokazuje, jak to można zrobić.

Przykład: Równoległe wydobywanie tekstu z wielu dokumentów

using IronPdf;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        string[] pdfFiles = { "doc1.pdf", "doc2.pdf", "doc3.pdf" };
        Parallel.ForEach(pdfFiles, pdfFile =>
        {
            var pdf = IronPdf.PdfDocument.FromFile(pdfFile);
            string text = pdf.ExtractText();
            System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text);
        });
    }
}
using IronPdf;
using System.Linq;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        string[] pdfFiles = { "doc1.pdf", "doc2.pdf", "doc3.pdf" };
        Parallel.ForEach(pdfFiles, pdfFile =>
        {
            var pdf = IronPdf.PdfDocument.FromFile(pdfFile);
            string text = pdf.ExtractText();
            System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text);
        });
    }
}
Imports IronPdf
Imports System.Linq
Imports System.Threading.Tasks

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim pdfFiles() As String = { "doc1.pdf", "doc2.pdf", "doc3.pdf" }
		Parallel.ForEach(pdfFiles, Sub(pdfFile)
			Dim pdf = IronPdf.PdfDocument.FromFile(pdfFile)
			Dim text As String = pdf.ExtractText()
			System.IO.File.WriteAllText($"extracted_{pdfFile}.txt", text)
		End Sub)
	End Sub
End Class
$vbLabelText   $csharpLabel

Dokumenty wynikowe

C# Parallel Foreach (How it Works for Developers): Rysunek 3

W tym kodzie każdy plik PDF jest przetwarzany równolegle w celu wydobycia tekstu, a wyodrębniony tekst jest zapisywany w osobnych plikach tekstowych.

Przykład: Generowanie PDF-ów z plików HTML w partiach równolegle

W tym przykładzie wygenerujemy wiele PDF-ów z listy plików HTML równolegle, co może być typowym scenariuszem, gdy potrzebujesz przekonwertować kilka dynamicznych stron HTML na dokumenty PDF.

Kod

using IronPdf;
using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        string[] htmlFiles = { "example.html", "example_1.html", "example_2.html" };
        Parallel.ForEach(htmlFiles, htmlFile =>
        {
            try
            {
                // Load the HTML content into IronPDF and convert it to PDF
                ChromePdfRenderer renderer = new ChromePdfRenderer();
                PdfDocument pdf = renderer.RenderHtmlFileAsPdf(htmlFile);
                // Save the generated PDF to the output folder
                pdf.SaveAs($"output_{htmlFile}.pdf");
                Console.WriteLine($"PDF created for {htmlFile}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error processing {htmlFile}: {ex.Message}");
            }
        });
    }
}
using IronPdf;
using System;
using System.Threading.Tasks;

class Program
{
    static void Main(string[] args)
    {
        string[] htmlFiles = { "example.html", "example_1.html", "example_2.html" };
        Parallel.ForEach(htmlFiles, htmlFile =>
        {
            try
            {
                // Load the HTML content into IronPDF and convert it to PDF
                ChromePdfRenderer renderer = new ChromePdfRenderer();
                PdfDocument pdf = renderer.RenderHtmlFileAsPdf(htmlFile);
                // Save the generated PDF to the output folder
                pdf.SaveAs($"output_{htmlFile}.pdf");
                Console.WriteLine($"PDF created for {htmlFile}");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"Error processing {htmlFile}: {ex.Message}");
            }
        });
    }
}
Imports IronPdf
Imports System
Imports System.Threading.Tasks

Friend Class Program
	Shared Sub Main(ByVal args() As String)
		Dim htmlFiles() As String = { "example.html", "example_1.html", "example_2.html" }
		Parallel.ForEach(htmlFiles, Sub(htmlFile)
			Try
				' Load the HTML content into IronPDF and convert it to PDF
				Dim renderer As New ChromePdfRenderer()
				Dim pdf As PdfDocument = renderer.RenderHtmlFileAsPdf(htmlFile)
				' Save the generated PDF to the output folder
				pdf.SaveAs($"output_{htmlFile}.pdf")
				Console.WriteLine($"PDF created for {htmlFile}")
			Catch ex As Exception
				Console.WriteLine($"Error processing {htmlFile}: {ex.Message}")
			End Try
		End Sub)
	End Sub
End Class
$vbLabelText   $csharpLabel

Wynik konsoli

C# Parallel Foreach (How it Works for Developers): Rysunek 4

Wynik w formacie PDF

C# Parallel Foreach (How it Works for Developers): Rysunek 5

Wyjaśnienie

  1. Pliki HTML: Tablica htmlFiles zawiera ścieżki do wielu plików HTML, które chcesz przekonwertować na PDF-y.

  2. Przetwarzanie równoległe:

    • Parallel.ForEach(htmlFiles, htmlFile => {...}) przetwarza każdy plik HTML równocześnie, co przyspiesza operację przy pracy z wieloma plikami.
    • Dla każdego pliku w tablicy htmlFiles, kod konwertuje go na PDF, używając renderer.RenderHtmlFileAsPdf(htmlFile);.
  3. Zapisywanie PDF: Po wygenerowaniu PDF-ów jest on zapisywany przy użyciu metody pdf.SaveAs, dodając nazwę pliku wyjściowego z nazwą oryginalnego pliku HTML.

  4. Obsługa błędów: Jeśli wystąpi jakikolwiek błąd (np. plik HTML nie istnieje lub wystąpi problem podczas konwersji), zostanie on wychwycony przez blok try-catch, a dla konkretnego pliku zostanie wyświetlony komunikat o błędzie.

Wskazówki dotyczące wydajności i najlepsze praktyki

Unikanie problemów z bezpieczeństwem wątków z IronPDF

IronPDF jest bezpieczny dla wątków w większości operacji. Jednak niektóre operacje, takie jak zapisywanie do tego samego pliku równocześnie, mogą powodować problemy. Zawsze upewnij się, że każda równoległa operacja działa na oddzielnym pliku wyjściowym lub zasobie.

Optymalizacja przetwarzania równoległego dla dużych zestawów danych

Aby zoptymalizować wydajność, rozważ kontrolowanie stopnia równoległości. Dla dużych zestawów danych możesz chcieć ograniczyć liczbę równoczesnych wątków, aby zapobiec przeciążeniu systemu.

var options = new ExecutionDataflowBlockOptions
{
    MaxDegreeOfParallelism = 4
};
var options = new ExecutionDataflowBlockOptions
{
    MaxDegreeOfParallelism = 4
};
Dim options = New ExecutionDataflowBlockOptions With {.MaxDegreeOfParallelism = 4}
$vbLabelText   $csharpLabel

Zarządzanie pamięcią w operacjach PDF w trybie równoległym

Podczas przetwarzania dużej liczby plików PDF zwracaj uwagę na zużycie pamięci. Spróbuj zwalniać zasoby, takie jak obiekty PdfDocument, gdy tylko nie są już potrzebne.

Używanie metod rozszerzających

Metoda rozszerzająca to specjalny rodzaj metody statycznej, która pozwala na dodanie nowej funkcjonalności do istniejącego typu bez modyfikowania jego kodu źródłowego. Może to być przydatne podczas pracy z bibliotekami takimi jak IronPDF, gdzie możesz chcieć dodać własne metody przetwarzania lub rozszerzyć ich funkcjonalność, aby uczynić pracę z PDF-ami bardziej wygodną, szczególnie w scenariuszach przetwarzania równoległego.

Zalety używania metod rozszerzających w przetwarzaniu równoległym

Dzięki użyciu metod rozszerzających możesz tworzyć zwięzły, wielokrotnego użytku kod, który upraszcza logikę w pętlach równoległych. Takie podejście nie tylko redukuje duplikację, ale również pomaga utrzymać czysty kod, szczególnie przy pracy z złożonymi procesami PDF i równoległą obróbką danych.

Wnioski

Używanie pętli równoległych takich jak Parallel.ForEach z IronPDF zapewnia znaczący wzrost wydajności przy przetwarzaniu dużych ilości PDF-ów. Niezależnie od tego, czy konwertujesz HTML na PDF-y, wydobywasz tekst, czy manipulujesz dokumentami, równoległa obróbka danych umożliwia szybsze wykonanie, wykonując zadania równocześnie. Podejście równoległe zapewnia, że operacje mogą być wykonywane na wielu procesorach, co skraca całkowity czas wykonania i poprawia wydajność przy zadaniach przetwarzania partii.

Chociaż przetwarzanie równoległe przyspiesza zadania, zwracaj uwagę na bezpieczeństwo wątków i zarządzanie zasobami. IronPDF jest bezpieczny dla wątków w większości operacji, ale ważne jest, aby radzić sobie z potencjalnymi konfliktami podczas uzyskiwania dostępu do wspólnych zasobów. Rozważ obsługę błędów i zarządzanie pamięcią, aby zapewnić stabilność, zwłaszcza gdy Twoja aplikacja się rozwija.

Jeśli jesteś gotowy, aby zagłębić się w IronPDF i odkryć zaawansowane funkcje, oficjalna dokumentacja zawiera obszerne informacje. Dodatkowo, możesz skorzystać z licencji próbnej, która pozwala przetestować bibliotekę w swoich projektach, zanim zdecydujesz się na zakup.

Często Zadawane Pytania

Jak mogę przekonwertować wiele plików HTML na PDF jednocześnie w C#?

Możesz użyć IronPDF z metodą Parallel.ForEach, aby jednocześnie przekonwertować wiele plików HTML na PDF. To podejście wykorzystuje przetwarzanie współbieżne, aby zwiększyć wydajność poprzez zmniejszenie całkowitego czasu wykonania.

Jakie są korzyści z używania Parallel.ForEach z przetwarzaniem PDF w C#?

Użycie Parallel.ForEach z IronPDF pozwala na współbieżne wykonanie zadań PDF, znacząco zwiększając wydajność, zwłaszcza przy pracy z dużymi ilościami plików. Ta metoda wykorzystuje wiele rdzeni do lepszego zarządzania zadaniami, takimi jak konwersja HTML na PDF i ekstrakcja tekstu.

Jak zainstalować bibliotekę PDF dla zadań równoległych w .NET?

Aby zainstalować IronPDF do projektu .NET, otwórz Visual Studio i przejdź do Narzędzia → Menedżer pakietów NuGet → Zarządzaj pakietami NuGet dla rozwiązania. Wyszukaj IronPDF i kliknij Zainstaluj. Alternatywnie, użyj konsoli Menedżera pakietów NuGet z komendą: Install-Package IronPdf.

Jakie są najlepsze praktyki dotyczące obsługi błędów w równoległym przetwarzaniu PDF?

W równoległym przetwarzaniu PDF z IronPDF użyj bloków try-catch wewnątrz pętli Parallel.ForEach do obsługi wyjątków. To zapewnia solidne zarządzanie błędami i zapobiega, aby awarie poszczególnych zadań wpływały na cały proces.

Czy IronPDF może jednocześnie ekstrahować tekst z wielu PDF?

Tak, IronPDF może jednocześnie ekstrahować tekst z wielu PDF, wykorzystując metodę Parallel.ForEach, umożliwiając współbieżne przetwarzanie dla sprawnej obsługi dużych zbiorów danych.

Czy IronPDF jest bezpieczny dla wątków dla współbieżnych operacji PDF?

IronPDF jest zaprojektowany tak, aby był bezpieczny dla wątków dla większości operacji. Ważne jest jednak, aby każde równoległe zadanie było wykonywane na oddzielnych zasobach, takich jak różne pliki, aby uniknąć konfliktów i zapewnić integralność danych.

Jak mogę poprawić zarządzanie pamięcią podczas równoległych operacji PDF w C#?

Aby zoptymalizować zarządzanie pamięcią, zwalniaj zasoby takie jak obiekty PdfDocument niezwłocznie po ich użyciu, zwłaszcza podczas przetwarzania dużej liczby PDF. Pomaga to w utrzymaniu optymalnego zużycia pamięci i wydajności systemu.

Jaką rolę odgrywają metody rozszerzeń w równoległym przetwarzaniu PDF w C#?

Metody rozszerzeń pozwalają dodać funkcjonalność do istniejących typów bez modyfikowania ich kodu źródłowego. Są przydatne w równoległym przetwarzaniu PDF z IronPDF do tworzenia wielokrotnego użytku, zwięzłego kodu, upraszczając operacje w ramach pętli równoległych.

Jak mogę kontrolować stopień równoległości w C# dla zadań PDF?

W C# można kontrolować stopień równoległości dla zadań PDF, korzystając z opcji takich jak ExecutionDataflowBlockOptions, aby ograniczyć liczbę wątków współbieżnych. Pomaga to efektywnie zarządzać zasobami systemowymi i zapobiegać przeciążeniu.

Jacob Mellor, Dyrektor Technologiczny @ Team Iron
Dyrektor ds. technologii

Jacob Mellor jest Chief Technology Officer w Iron Software i wizjonerskim inżynierem, pionierem technologii C# PDF. Jako pierwotny deweloper głównej bazy kodowej Iron Software, kształtuje architekturę produktów firmy od jej początku, przekształcając ją wspólnie z CEO Cameron Rimington w firmę liczą...

Czytaj więcej

Zespol wsparcia Iron

Jestesmy online 24 godziny, 5 dni w tygodniu.
Czat
Email
Zadzwon do mnie