Asenkron ve Çoklu İş Parçacığı ile PDF Oluşturma

C# ile Asenkron ve Çoklu İş Parçacığı Kullanarak PDF Nasıl Oluşturulur

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

IronPDF, C#'ta asenkron işlemler ve çoklu iş parçacığı kullanarak yüksek performanslı PDF oluşturmayı sağlar, karmaşık HTML işleme senaryolarında senkron yöntemlere göre toplu işlem zamanını %65'e kadar azaltır.

Hızlı Başlangıç: IronPDF ile HTML'yi Asenkron Olarak PDF'ye Dönüştür

IronPDF kullanarak sadece birkaç satır kodla asenkron PDF oluşturmaya başlayın.

IronPDF ile uygulamanızın performansını optimize ederek HTML içeriğini PDF'ye verimli bir şekilde dönüştürebilirsiniz. Bu kılavuz, toplu işlem ve çoklu iş parçacıklı ortamlar için ideal olan yüksek performanslı PDF oluşturmada asenkron işlemlerin nasıl kullanılacağını gösterir.

  1. NuGet Paket Yöneticisi ile https://www.nuget.org/packages/IronPdf yükleyin

    PM > Install-Package IronPdf
  2. Bu kod parçasını kopyalayıp çalıştırın.

    var pdf = await IronPdf.ChromePdfRenderer.RenderHtmlAsPdfAsync("<h1>Hello World!</h1>");
  3. Canlı ortamınızda test etmek için dağıtın

    Bugün projenizde IronPDF kullanmaya başlayın ücretsiz deneme ile

    arrow pointer


C#'ta Asenkron PDF Oluşturmayı Nasıl Uygularım?

IronPDF, RenderHtmlAsPdfAsync gibi render etme metotlarını kullanarak asenkron işlemleri tam anlamıyla destekler. IronPDF'deki asenkron uygulama, görev tabanlı Asenkron Deseni (TAP) kullanarak engelleyici olmayan PDF oluşturma işlemleri sağlar. Bu yaklaşım, karmaşık HTML içerik işleme veya eşzamanlı PDF istek işlemesinden faydalanır.

Asenkron PDF oluşturma, masaüstü uygulamalarında UI donmasını önler ve web uygulamalarında istek verimini artırır. Uygulamanızın PDF render işlemi tamamlanırken diğer işlemleri yapabilmesini sağlayan async/await kalıplarını kullanarak yanıt verebilirliği ve kullanıcı deneyimini önemli ölçüde artırabilirsiniz.

PDF Oluşturma İçin Neden Asenkron Yöntemler Kullanmalıyım?

Asenkron yöntemler, PDF oluşturma iş akışları için kilit avantajlar sunar. Kaynak yoğun işlemler sırasında uygulama duyarlılığını korur, çok çekirdekli işlemcilerde daha iyi kaynak kullanımı sağlar ve sunucu ortamlarında ölçeklenebilirliği artırır. Karmaşık HTML'den PDF'ye dönüşümleri ele alırken, asenkron işlemler süre aşımı sorunlarını önler ve kullanıcı deneyimini geliştirir.

:path=/static-assets/pdf/content-code-examples/how-to/async-async.cs
using IronPdf;
using System.Threading.Tasks;

// Instantiate ChromePdfRenderer
ChromePdfRenderer renderer = new ChromePdfRenderer();

string[] htmlStrings = {"<h1>Html 1</h1>", "<h1>Html 2</h1>", "<h1>Html 3</h1>"};

// Create an array to store the tasks for rendering
var renderingTasks = new Task<PdfDocument>[htmlStrings.Length];

for (int i = 0; i < htmlStrings.Length; i++)
{
    int index = i; // Capturing the loop variable
    renderingTasks[i] = Task.Run(async () =>
    {
        // Render HTML to PDF
        return await renderer.RenderHtmlAsPdfAsync(htmlStrings[index]);
    });
}

// Wait for all rendering tasks to complete
// await Task.WhenAll(renderingTasks);
Imports IronPdf
Imports System.Threading.Tasks

' Instantiate ChromePdfRenderer
Private renderer As New ChromePdfRenderer()

Private htmlStrings() As String = {"<h1>Html 1</h1>", "<h1>Html 2</h1>", "<h1>Html 3</h1>"}

' Create an array to store the tasks for rendering
Private renderingTasks = New Task(Of PdfDocument)(htmlStrings.Length - 1){}

For i As Integer = 0 To htmlStrings.Length - 1
	Dim index As Integer = i ' Capturing the loop variable
	renderingTasks(i) = Task.Run(Async Function()
		' Render HTML to PDF
		Return Await renderer.RenderHtmlAsPdfAsync(htmlStrings(index))
	End Function)
Next i

' Wait for all rendering tasks to complete
' await Task.WhenAll(renderingTasks);
$vbLabelText   $csharpLabel

Toplu İşleme İçin Yaygın Kalıplar Nelerdir?

Toplu PDF işleme, belleğin kullanımı ve performansına dikkatli bir yaklaşım gerektirir. Etkili kalıplar; birden fazla PDF üretiminin paralel yürütülmesi için Task.WhenAll kullanımını, büyük kümeler için kanallarla üretici-tüketici kalıplarının uygulanmasını ve IronPDF belgelerindeki paralel işleme örneklerinden yararlanmayı içerir.

// Batch processing with progress tracking
public async Task<List<PdfDocument>> ProcessBatchAsync(List<string> htmlContents, IProgress<int> progress)
{
    var renderer = new ChromePdfRenderer();
    var results = new List<PdfDocument>();
    var completed = 0;

    var tasks = htmlContents.Select(async html => {
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        Interlocked.Increment(ref completed);
        progress?.Report(completed);
        return pdf;
    });

    results.AddRange(await Task.WhenAll(tasks));
    return results;
}
// Batch processing with progress tracking
public async Task<List<PdfDocument>> ProcessBatchAsync(List<string> htmlContents, IProgress<int> progress)
{
    var renderer = new ChromePdfRenderer();
    var results = new List<PdfDocument>();
    var completed = 0;

    var tasks = htmlContents.Select(async html => {
        var pdf = await renderer.RenderHtmlAsPdfAsync(html);
        Interlocked.Increment(ref completed);
        progress?.Report(completed);
        return pdf;
    });

    results.AddRange(await Task.WhenAll(tasks));
    return results;
}
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks

' Batch processing with progress tracking
Public Async Function ProcessBatchAsync(htmlContents As List(Of String), progress As IProgress(Of Integer)) As Task(Of List(Of PdfDocument))
    Dim renderer As New ChromePdfRenderer()
    Dim results As New List(Of PdfDocument)()
    Dim completed As Integer = 0

    Dim tasks = htmlContents.Select(Async Function(html)
                                        Dim pdf = Await renderer.RenderHtmlAsPdfAsync(html)
                                        Interlocked.Increment(completed)
                                        progress?.Report(completed)
                                        Return pdf
                                    End Function)

    results.AddRange(Await Task.WhenAll(tasks))
    Return results
End Function
$vbLabelText   $csharpLabel

Asenkron PDF İşlemlerinde Hataları Nasıl Ele Alırım?

Asenkron PDF işlemlerinde hata yönetimi, kapsamlı istisna yönetimi stratejileri gerektirir. Asenkron yöntemler içinde try-catch blokları kullanın, geçici hatalar için yeniden deneme mantığını uygulayın ve gelişmiş yeniden deneme politikaları için Polly kullanmayı düşünün. Detaylı performans sorun giderme için, IronPDF kapsamlı günlük kaydı yetenekleri sağlar.

public async Task<PdfDocument> RenderWithRetryAsync(string html, int maxRetries = 3)
{
    var renderer = new ChromePdfRenderer();

    for (int i = 0; i < maxRetries; i++)
    {
        try
        {
            return await renderer.RenderHtmlAsPdfAsync(html);
        }
        catch (Exception ex) when (i < maxRetries - 1)
        {
            // Log the exception
            await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, i))); // Exponential backoff
        }
    }

    throw new InvalidOperationException("Failed to render PDF after maximum retries");
}
public async Task<PdfDocument> RenderWithRetryAsync(string html, int maxRetries = 3)
{
    var renderer = new ChromePdfRenderer();

    for (int i = 0; i < maxRetries; i++)
    {
        try
        {
            return await renderer.RenderHtmlAsPdfAsync(html);
        }
        catch (Exception ex) when (i < maxRetries - 1)
        {
            // Log the exception
            await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, i))); // Exponential backoff
        }
    }

    throw new InvalidOperationException("Failed to render PDF after maximum retries");
}
Imports System
Imports System.Threading.Tasks

Public Class PdfRenderer
    Public Async Function RenderWithRetryAsync(html As String, Optional maxRetries As Integer = 3) As Task(Of PdfDocument)
        Dim renderer As New ChromePdfRenderer()

        For i As Integer = 0 To maxRetries - 1
            Try
                Return Await renderer.RenderHtmlAsPdfAsync(html)
            Catch ex As Exception When i < maxRetries - 1
                ' Log the exception
                Await Task.Delay(TimeSpan.FromSeconds(Math.Pow(2, i))) ' Exponential backoff
            End Try
        Next

        Throw New InvalidOperationException("Failed to render PDF after maximum retries")
    End Function
End Class
$vbLabelText   $csharpLabel

PDF Oluşturmak için Çoklu İş Parçacığı Nasıl Kullanılır?

IronPDF, ChromePdfRenderer render motorunu kullanırken iş parçacığı güvenliğini sağlar ve çoklu işlemeyi destekler. macOS makinelerinde çoklu işlemenin kısıtlı olduğunu unutmayın. Chrome işleme motoru, eşzamanlı işlemler için mükemmel iş parçacığı güvenliği ve performans özellikleri sağlar.

Parallel.ForEach kalıbı, mevcut tüm CPU çekirdeklerinden etkin biçimde yararlanarak toplu PDF işleme için oldukça uygundur. Kapsamlı çok iş parçacıklı üretim örnekleri için IronPDF belgelerine bakın.

Neden Çoklu İş Parçacığını Asenkron Üzerine Seçmeliyim?

Çoklu iş parçacığı, birden fazla PDF'yi eşzamanlı olarak işlemek istediğinizde ve yeterli sistem kaynaklarına sahip olduğunuzda ideal olan CPU'ya bağlı işlemler için idealdir. Büyük PDF parti işlemlerinde çoklu iş parçacığını seçin, her bir PDF oluşturma bağımsız olduğunda ve bellek kullanımını kontrol edebildiğinizde seçin. Asenkron, I/O'ya bağlı işlemler ve uygulama duyarlılığını sürdürmek için daha iyidir.

İş Parçacığı Güvenliği Dikkat Edilmesi Gerekenler Nelerdir?

IronPDF'nin ChromePdfRenderer sınıfı iş parçacığı güvenliği sağlasa da dikkate alınması gereken bazı hususlar vardır. Özel ayarlarla kullanırken her iş parçacığı için ayrı renderer örnekleri oluşturun, PdfDocument örneklerini senkronizasyon yapılmadan iş parçacıkları arasında paylaşmaktan kaçının ve aynı anda büyük belgeler işlerken bellek tüketimini izleyin. kurulum genel bakışı, IronPDF'yi optimal iş parçacığı güvenliği için yapılandırma hakkında ek ayrıntılar sağlar.

// Thread-safe PDF generation with custom settings per thread
public void ProcessPdfsInParallel(List<string> htmlContents)
{
    Parallel.ForEach(htmlContents, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, 
        html =>
        {
            // Create a new renderer instance for each thread
            var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    MarginTop = 10,
                    MarginBottom = 10,
                    PaperSize = IronPdf.Rendering.PdfPaperSize.A4
                }
            };

            var pdf = renderer.RenderHtmlAsPdf(html);
            pdf.SaveAs($"output_{Thread.CurrentThread.ManagedThreadId}_{DateTime.Now.Ticks}.pdf");
        });
}
// Thread-safe PDF generation with custom settings per thread
public void ProcessPdfsInParallel(List<string> htmlContents)
{
    Parallel.ForEach(htmlContents, new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount }, 
        html =>
        {
            // Create a new renderer instance for each thread
            var renderer = new ChromePdfRenderer
            {
                RenderingOptions = new ChromePdfRenderOptions
                {
                    MarginTop = 10,
                    MarginBottom = 10,
                    PaperSize = IronPdf.Rendering.PdfPaperSize.A4
                }
            };

            var pdf = renderer.RenderHtmlAsPdf(html);
            pdf.SaveAs($"output_{Thread.CurrentThread.ManagedThreadId}_{DateTime.Now.Ticks}.pdf");
        });
}
Imports System
Imports System.Collections.Generic
Imports System.Threading
Imports System.Threading.Tasks
Imports IronPdf

' Thread-safe PDF generation with custom settings per thread
Public Sub ProcessPdfsInParallel(htmlContents As List(Of String))
    Parallel.ForEach(htmlContents, New ParallelOptions With {.MaxDegreeOfParallelism = Environment.ProcessorCount},
        Sub(html)
            ' Create a new renderer instance for each thread
            Dim renderer = New ChromePdfRenderer With {
                .RenderingOptions = New ChromePdfRenderOptions With {
                    .MarginTop = 10,
                    .MarginBottom = 10,
                    .PaperSize = IronPdf.Rendering.PdfPaperSize.A4
                }
            }

            Dim pdf = renderer.RenderHtmlAsPdf(html)
            pdf.SaveAs($"output_{Thread.CurrentThread.ManagedThreadId}_{DateTime.Now.Ticks}.pdf")
        End Sub)
End Sub
$vbLabelText   $csharpLabel

Kaç Tane Eşzamanlı İş Parçacığı Kullanmalıyım?

Eşzamanlı iş parçacıklarının optimal sayısı, CPU çekirdeklerine, mevcut belleğe ve PDF karmaşıklığına bağlıdır. Genel yönergeler; CPU'ya bağlı işlemler için Environment.ProcessorCount kullanılmasını, bellek yoğun PDF'ler için 2-4 iş parçacığıyla sınırlandırılmasını ve sistem kaynaklarını izleyerek en uygun yapılandırmanın bulunmasını kapsar. Asenkron örnekler, çeşitli iş parçacığı stratejilerini gösterir.

Bekleyebileceğim Performans İyileştirmeleri Nelerdir?

Bir karşılaştırma, işleme yaklaşımları arasında önemli performans farklılıkları gösteriyor. Karmaşık HTML oluşturma simülasyonu için Bekle Sınıfı'nı Kullanarak İşleme sırasında 5 saniyelik bir gecikme eklenir. Aşağıda, yukarıda açıklanan çeşitli teknikleri kullanarak performansın bir karşılaştırma tablosu bulunmaktadır.

Asenkron, Neden Senkronize Olandan Daha İyi Performans Gösteriyor?

Normal İşleme Asenkron İşleme Çok iş parçacıklı işleme
15.75 saniye 05.59 saniye 05.68 saniye

Asenkron işlemler, verimli iş parçacığı havuzu kaynak yönetimine izin verdikleri, ana iş parçacığını engellemedikleri ve I/O işlemleri sırasında daha iyi CPU kullanımı sağladıkları için üstün performans gösterir. Performans iyileştirmesi, her birinin sırasıyla tamamlanmasını beklemek yerine, aynı anda birden fazla işlem başlatmaktan gelir.

Uygulamamdaki Performansı Nasıl Ölçebilirim?

PDF oluşturma performansını ölçmek doğru kıyaslama ve izleme gerektirir. Doğru zaman ölçümleri için System.Diagnostics.Stopwatch kullanın, üretim izleme için özel performans sayaçları uygulayın ve uygulama içgörüleri ya da benzeri APM araçlarından yararlanın. Performans testi için bir temel olarak hızlı başlangıç kılavuzu örneklerini kullanmayı düşünün.

public async Task<PerformanceMetrics> MeasurePerformanceAsync(string html, int iterations)
{
    var metrics = new PerformanceMetrics();
    var renderer = new ChromePdfRenderer();
    var stopwatch = new Stopwatch();

    // Warm-up run
    await renderer.RenderHtmlAsPdfAsync(html);

    for (int i = 0; i < iterations; i++)
    {
        stopwatch.Restart();
        await renderer.RenderHtmlAsPdfAsync(html);
        stopwatch.Stop();

        metrics.AddMeasurement(stopwatch.ElapsedMilliseconds);
    }

    return metrics;
}
public async Task<PerformanceMetrics> MeasurePerformanceAsync(string html, int iterations)
{
    var metrics = new PerformanceMetrics();
    var renderer = new ChromePdfRenderer();
    var stopwatch = new Stopwatch();

    // Warm-up run
    await renderer.RenderHtmlAsPdfAsync(html);

    for (int i = 0; i < iterations; i++)
    {
        stopwatch.Restart();
        await renderer.RenderHtmlAsPdfAsync(html);
        stopwatch.Stop();

        metrics.AddMeasurement(stopwatch.ElapsedMilliseconds);
    }

    return metrics;
}
Imports System.Diagnostics
Imports System.Threading.Tasks

Public Class PerformanceMetrics
    ' Assume this class has an AddMeasurement method
    Public Sub AddMeasurement(milliseconds As Long)
        ' Implementation here
    End Sub
End Class

Public Class ChromePdfRenderer
    ' Assume this class has a RenderHtmlAsPdfAsync method
    Public Async Function RenderHtmlAsPdfAsync(html As String) As Task
        ' Implementation here
    End Function
End Class

Public Class PerformanceTester
    Public Async Function MeasurePerformanceAsync(html As String, iterations As Integer) As Task(Of PerformanceMetrics)
        Dim metrics As New PerformanceMetrics()
        Dim renderer As New ChromePdfRenderer()
        Dim stopwatch As New Stopwatch()

        ' Warm-up run
        Await renderer.RenderHtmlAsPdfAsync(html)

        For i As Integer = 0 To iterations - 1
            stopwatch.Restart()
            Await renderer.RenderHtmlAsPdfAsync(html)
            stopwatch.Stop()

            metrics.AddMeasurement(stopwatch.ElapsedMilliseconds)
        Next

        Return metrics
    End Function
End Class
$vbLabelText   $csharpLabel

PDF Oluşturma Hızını Etkileyen Faktörler Nelerdir?

PDF oluşturma performansını etkileyen çeşitli faktörler vardır. JavaScript yürütme ve CSS işleme dâhil olmak üzere HTML karmaşıklığı, işlem süresini doğrudan etkiler. Görüntüler ve yazı tipleri gibi harici kaynakların yüklenmesi gecikmelere neden olabilir. CPU, bellek ve disk I/O gibi sistem kaynakları önemli roller oynar. IronPDF yapılandırması, işleme seçenekleri ve motor ayarları dâhil olacak şekilde hızı da etkiler. Bu faktörleri anlamak, maksimum verimlilik için PDF oluşturma iş akışınızı optimize etmenize yardımcı olur.

Yoğun JavaScript veya gecikmeli işleme içeren karmaşık senaryolar için, PDF oluşturulmadan önce sayfanın tam olarak işlenmesini sağlamak için Bekle mekanizmalarını kullanmayı düşünün. Bu yaklaşım, tutarlı performans özelliklerini korurken doğru çıktıyı garanti eder.

Sıkça Sorulan Sorular

Eşzamansız PDF oluşturma ile ne kadar performans artışı bekleyebilirim?

IronPDF'in eşzamansız işlemleri ve çok iş parçacıklı yapısı, özellikle karmaşık HTML içerikleri işlerken senkron yöntemlere kıyasla toplu işlem süresini %65'e kadar azaltabilir. Gerçek performans kazancı, HTML'nin karmaşıklığı, sistem kaynakları ve eşzamanlı işlemlerin sayısı gibi faktörlere bağlıdır.

HTML'yi eşzamansız şekilde PDF'ye dönüştürmenin en basit yolu nedir?

En basit yol, IronPDF'in RenderHtmlAsPdfAsync yöntemini kullanmaktır. Sadece bir satır kodla: `var pdf = await IronPdf.ChromePdfRenderer.RenderHtmlAsPdfAsync("Hello World!");` HTML içeriğini PDF'ye etkili bir şekilde dönüştürebilir ve uygulama yanıt verme yeteneğini koruyabilirsiniz.

Neden eşzamansız yöntemler yerine senkron PDF oluşturmayı tercih etmeliyim?

IronPDF içerisindeki eşzamansız yöntemler, masaüstü uygulamalarında arayüz donmasını önler, web uygulamalarında talep geçirgenliğini artırır, çok çekirdekli işlemcilerde daha iyi kaynak kullanımı sağlar ve sunucu ortamlarında ölçeklenebilirliği artırır. Özellikle karmaşık HTML'den PDF'ye dönüşümleri işlerken ya da aynı anda birden fazla PDF talebini işlerken faydalıdırlar.

Kütüphane, PDF işlemleri için hangi eşzamansız deseni kullanıyor?

IronPDF, eşzamansız işlemleri için, RenderHtmlAsPdfAsync gibi yöntemleri içeren Görev Tabanlı Eşzamansız Deseni (TAP) uygular. Bu desen, bloklamayan PDF oluşturma işlemlerini mümkün kılar ve C#'ın async/await anahtar kelimeleriyle sorunsuz entegre olur.

Daha iyi performans için birden fazla PDF'yi paralel olarak nasıl işleyebilirim?

IronPDF, birden fazla PDF üretiminin paralel olarak yürütülmesi için Task.WhenAll gibi desenleri kullanarak toplu işlemeyi, PDF işlemede çoklu iş parçacıklılığı için Parallel.ForEach'ü ve büyük partiler için kanallarla üretici-tüketici desenlerini destekler. Bu yaklaşımlar, kaynak kullanımını optimize eder ve toplam işlem süresini önemli ölçüde azaltır.

Chipego
Yazılım Mühendisi
Chipego, müşteri sorunlarını anlamasına ve akıllı çözümler sunmasına yardımcı olan doğal bir dinleme becerisine sahiptir. 2023 yılında Iron Software ekibine katıldı ve Bilgi Teknolojileri alanında Bilim Lisansı aldı. Chipego’nun odaklandığı iki ürün IronPDF ve IronOCR'dur, ancak tü...
Daha Fazlasını Oku
Başlamaya Hazır mısınız?
Nuget Indirmeler 18,332,619 | Sürüm: 2026.4 yeni yayınlandı
Still Scrolling Icon

Hala Kaydiriyor musunuz?

Hızlı bir kanit mi istiyorsunuz? PM > Install-Package IronPdf
bir örnek çalıştır HTML'nizin PDF olduğunu izleyin.