Passer au contenu du pied de page
.NET AIDE

C# BackgroundWorker (Comment ça fonctionne pour les développeurs)

La génération de PDF avec IronPDF est une tâche courante pour les développeurs .NET—surtout lors de la création de rapports dynamiques, de factures ou de systèmes d'automatisation de documents. Mais si vous avez déjà déclenché la génération de PDF sur le thread principal de l'interface utilisateur dans une application Windows Forms ou WPF, vous avez probablement vu votre interface utilisateur se figer ou devenir non réactive. C'est particulièrement vrai lors du rendu de contenu HTML volumineux ou du traitement de mises en page PDF complexes.

C'est là que la classe C# BackgroundWorker intervient. Cet article explique comment intégrer IronPDF avec BackgroundWorker pour gérer les opérations asynchrones dans une application de bureau sans verrouiller l'interface utilisateur.

Pourquoi utiliser BackgroundWorker avec IronPDF ?

Gardez votre interface utilisateur réactive

Lorsque vous exécutez des tâches gourmandes en CPU ou liées aux entrées/sorties comme la génération de PDF sur le thread principal, cela verrouille l'interface utilisateur. Les utilisateurs ne peuvent pas cliquer, faire glisser ou interagir avec l'application pendant qu'elle est occupée. En utilisant un objet BackgroundWorker, vous pouvez déplacer le travail vers un thread séparé, gardant votre interface rapide et utilisable pendant le traitement en arrière-plan.

Parfait pour la génération de rapports et les tâches de longue durée

Si votre application implique l'exportation de données, la conversion de HTML en PDF ou le rendu de rapports détaillés—déléguer cela à un travailleur en arrière-plan rend votre application plus professionnelle et performante.

Compatible avec les applications WinForms héritées

Bien que les applications modernes utilisent souvent async/await, de nombreux anciens projets bénéficient encore de BackgroundWorker pour sa simplicité et son support de conception dans Visual Studio.

Qu'est-ce que IronPDF?

!

IronPDF est une puissante bibliothèque .NET conçue pour générer, modifier et travailler avec des documents PDF en C#. Cela utilise un navigateur Chromium sans tête sous le capot, permettant aux développeurs de convertir du HTML, du CSS, du JavaScript, et même des pages web complexes en PDF de qualité d'impression précise. Contrairement aux générateurs de PDF traditionnels, IronPDF rend les documents exactement comme ils apparaîtraient dans un navigateur—en respectant la mise en page, les polices, les images et les styles pixel par pixel.

Caractéristiques clés

  • Conversion HTML en PDF – Rendre des chaînes HTML, des URL, ou des pages web complètes en PDF.
  • Rendu d'images et de texte – Ajouter des en-têtes, pieds de page, filigranes, et images par programmation.
  • Fusion et division de PDF – Combiner plusieurs documents ou extraire des pages spécifiques.
  • Remplissage de formulaires et annotations – Travailler avec des formulaires PDF interactifs.
  • Aucune dépendance externe – Fonctionne sans Adobe Acrobat ou Microsoft Office installé.

IronPDF prend en charge .NET Framework, .NET Core, et .NET 6/7+, ce qui le rend idéal pour les applications .NET à la fois de bureau et basées sur le web.

Installation d'IronPDF via NuGet

Pour commencer, installez IronPDF dans votre projet à l'aide du gestionnaire de packages NuGet :

Install-Package IronPdf

Cela ajoutera toutes les références nécessaires pour que vous puissiez commencer à utiliser les fonctionnalités puissantes de ChromePdfRenderer, HtmlToPdf, et autres d'IronPDF.

Pour cet exemple, nous utiliserons une application Windows Forms créée avec Visual Studio, avec un bouton qui déclenche la génération du PDF et une étiquette pour indiquer quand le processus est terminé.

Implémentation de BackgroundWorker pour IronPDF

Maintenant, nous utiliserons les exemples de code suivants pour décomposer le processus d'utilisation de BackgroundWorker de manière structurée et sûre :

Étape 1 – Définir le BackgroundWorker

Vous pouvez créer et configurer un BackgroundWorker soit dans le concepteur, soit dans le code. Voici l'approche par code :

private void SetupBackgroundWorker()
{
    // new backgroundworker worker instance
    worker = new BackgroundWorker(); // dowork event handler
    worker.DoWork += PdfWorker_DoWork;
    worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted; // final result handler
}
private void SetupBackgroundWorker()
{
    // new backgroundworker worker instance
    worker = new BackgroundWorker(); // dowork event handler
    worker.DoWork += PdfWorker_DoWork;
    worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted; // final result handler
}
Private Sub SetupBackgroundWorker()
	' new backgroundworker worker instance
	worker = New BackgroundWorker() ' dowork event handler
	worker.DoWork += PdfWorker_DoWork
	worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted ' final result handler
End Sub
$vbLabelText   $csharpLabel

Cela initialise le travailleur et connecte les événements nécessaires pour l'exécution et l'achèvement en arrière-plan.

Étape 2 – Gérer l'événement DoWork

La méthode DoWork s'exécute sur un thread différent, effectuant l'opération en arrière-plan (générant le PDF) :

private void PdfWorker_DoWork(object sender, DoWorkEventArgs e)
{
    var Renderer = new ChromePdfRenderer();
    // Simulate input from UI or parameters
    string htmlContent = "<h1>Monthly Report</h1><p>Generated with IronPDF.</p>";
    string outputPath = Path.Combine(Environment.CurrentDirectory, "Report.pdf");
    // Generate PDF
    var pdf = Renderer.RenderHtmlAsPdf(htmlContent);
    pdf.SaveAs(outputPath);
    // Optionally pass result info
    e.Result = outputPath; // pass value to RunWorkerCompleted
}
private void PdfWorker_DoWork(object sender, DoWorkEventArgs e)
{
    var Renderer = new ChromePdfRenderer();
    // Simulate input from UI or parameters
    string htmlContent = "<h1>Monthly Report</h1><p>Generated with IronPDF.</p>";
    string outputPath = Path.Combine(Environment.CurrentDirectory, "Report.pdf");
    // Generate PDF
    var pdf = Renderer.RenderHtmlAsPdf(htmlContent);
    pdf.SaveAs(outputPath);
    // Optionally pass result info
    e.Result = outputPath; // pass value to RunWorkerCompleted
}
Private Sub PdfWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
	Dim Renderer = New ChromePdfRenderer()
	' Simulate input from UI or parameters
	Dim htmlContent As String = "<h1>Monthly Report</h1><p>Generated with IronPDF.</p>"
	Dim outputPath As String = Path.Combine(Environment.CurrentDirectory, "Report.pdf")
	' Generate PDF
	Dim pdf = Renderer.RenderHtmlAsPdf(htmlContent)
	pdf.SaveAs(outputPath)
	' Optionally pass result info
	e.Result = outputPath ' pass value to RunWorkerCompleted
End Sub
$vbLabelText   $csharpLabel

Remarque : Vous ne pouvez pas interagir avec les contrôles de l'interface utilisateur ici car cela s'exécute sur un thread de travail.

Étape 3 – Utiliser RunWorkerCompleted pour notifier l'achèvement

Une fois le thread en arrière-plan terminé, vous pouvez mettre à jour l'interface utilisateur en toute sécurité avec les résultats.

private void PdfWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        MessageBox.Show("Error: " + e.Error.Message);
    }
    else
    {
        string savedPath = e.Result.ToString();
        MessageBox.Show("PDF created at:\n" + savedPath);
    }
}
private void PdfWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
    if (e.Error != null)
    {
        MessageBox.Show("Error: " + e.Error.Message);
    }
    else
    {
        string savedPath = e.Result.ToString();
        MessageBox.Show("PDF created at:\n" + savedPath);
    }
}
Imports Microsoft.VisualBasic

Private Sub PdfWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
	If e.Error IsNot Nothing Then
		MessageBox.Show("Error: " & e.Error.Message)
	Else
		Dim savedPath As String = e.Result.ToString()
		MessageBox.Show("PDF created at:" & vbLf & savedPath)
	End If
End Sub
$vbLabelText   $csharpLabel

Étape 4 – Déclencher BackgroundWorker depuis l'interface utilisateur

Ajoutez un bouton Démarrer pour exécuter la tâche en arrière-plan lorsqu'il est cliqué :

private void btnGeneratePDF_Click(object sender, EventArgs e)
{
    if (pdfWorker == null)
        SetupBackgroundWorker();
    if (!pdfWorker.IsBusy)
    {
        btnGeneratePDF.Enabled = false;
        pdfWorker.RunWorkerAsync(); // execute method in background
    }
}
private void btnGeneratePDF_Click(object sender, EventArgs e)
{
    if (pdfWorker == null)
        SetupBackgroundWorker();
    if (!pdfWorker.IsBusy)
    {
        btnGeneratePDF.Enabled = false;
        pdfWorker.RunWorkerAsync(); // execute method in background
    }
}
Private Sub btnGeneratePDF_Click(ByVal sender As Object, ByVal e As EventArgs)
	If pdfWorker Is Nothing Then
		SetupBackgroundWorker()
	End If
	If Not pdfWorker.IsBusy Then
		btnGeneratePDF.Enabled = False
		pdfWorker.RunWorkerAsync() ' execute method in background
	End If
End Sub
$vbLabelText   $csharpLabel

Exemple de code complet

Voici tout réuni dans un seul extrait fonctionnel Windows Forms :

using System;
using System.ComponentModel;
using IronPdf;
using System.IO;
using System.Windows.Forms;
namespace TestApp
{
    public partial class Form1 : Form
    {
        private BackgroundWorker worker;
        public Form1()
        {
            InitializeComponent();
            SetupBackgroundWorker();        }
        private void SetupBackgroundWorker()
        {
            worker = new BackgroundWorker();
            worker.DoWork += PdfWorker_DoWork;
            worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted;
        }
        private void btnGeneratePDF_Click(object sender, EventArgs e)
        {
            if (!worker.IsBusy)
            {
                btnGeneratePDF.Enabled = false;
                worker.RunWorkerAsync();
            }
        }
        private void PdfWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var Renderer = new ChromePdfRenderer();
            string htmlContent = "<h1>Report</h1><p>This PDF was generated in the background.</p>";
            string outputPath = Path.Combine(Environment.CurrentDirectory, "Report.pdf");
            var pdf = Renderer.RenderHtmlAsPdf(htmlContent);
            pdf.SaveAs(outputPath);
            e.Result = outputPath;
        }
        private void PdfWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            btnGeneratePDF.Enabled = true;
            if (e.Error != null)
            {
                MessageBox.Show("Failed: " + e.Error.Message);
            }
            else
            {
                MessageBox.Show("PDF created: " + e.Result.ToString());
            }
        }
        private void btnGeneratePDF_Click_1(object sender, EventArgs e)
        {
            if (!worker.IsBusy)
            {
                btnGeneratePDF.Enabled = false;
                worker.RunWorkerAsync();
            }
        }
    }
}
using System;
using System.ComponentModel;
using IronPdf;
using System.IO;
using System.Windows.Forms;
namespace TestApp
{
    public partial class Form1 : Form
    {
        private BackgroundWorker worker;
        public Form1()
        {
            InitializeComponent();
            SetupBackgroundWorker();        }
        private void SetupBackgroundWorker()
        {
            worker = new BackgroundWorker();
            worker.DoWork += PdfWorker_DoWork;
            worker.RunWorkerCompleted += PdfWorker_RunWorkerCompleted;
        }
        private void btnGeneratePDF_Click(object sender, EventArgs e)
        {
            if (!worker.IsBusy)
            {
                btnGeneratePDF.Enabled = false;
                worker.RunWorkerAsync();
            }
        }
        private void PdfWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            var Renderer = new ChromePdfRenderer();
            string htmlContent = "<h1>Report</h1><p>This PDF was generated in the background.</p>";
            string outputPath = Path.Combine(Environment.CurrentDirectory, "Report.pdf");
            var pdf = Renderer.RenderHtmlAsPdf(htmlContent);
            pdf.SaveAs(outputPath);
            e.Result = outputPath;
        }
        private void PdfWorker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            btnGeneratePDF.Enabled = true;
            if (e.Error != null)
            {
                MessageBox.Show("Failed: " + e.Error.Message);
            }
            else
            {
                MessageBox.Show("PDF created: " + e.Result.ToString());
            }
        }
        private void btnGeneratePDF_Click_1(object sender, EventArgs e)
        {
            if (!worker.IsBusy)
            {
                btnGeneratePDF.Enabled = false;
                worker.RunWorkerAsync();
            }
        }
    }
}
Imports System
Imports System.ComponentModel
Imports IronPdf
Imports System.IO
Imports System.Windows.Forms
Namespace TestApp
	Partial Public Class Form1
		Inherits Form

		Private worker As BackgroundWorker
		Public Sub New()
			InitializeComponent()
			SetupBackgroundWorker()
		End Sub
		Private Sub SetupBackgroundWorker()
			worker = New BackgroundWorker()
			AddHandler worker.DoWork, AddressOf PdfWorker_DoWork
			AddHandler worker.RunWorkerCompleted, AddressOf PdfWorker_RunWorkerCompleted
		End Sub
		Private Sub btnGeneratePDF_Click(ByVal sender As Object, ByVal e As EventArgs)
			If Not worker.IsBusy Then
				btnGeneratePDF.Enabled = False
				worker.RunWorkerAsync()
			End If
		End Sub
		Private Sub PdfWorker_DoWork(ByVal sender As Object, ByVal e As DoWorkEventArgs)
			Dim Renderer = New ChromePdfRenderer()
			Dim htmlContent As String = "<h1>Report</h1><p>This PDF was generated in the background.</p>"
			Dim outputPath As String = Path.Combine(Environment.CurrentDirectory, "Report.pdf")
			Dim pdf = Renderer.RenderHtmlAsPdf(htmlContent)
			pdf.SaveAs(outputPath)
			e.Result = outputPath
		End Sub
		Private Sub PdfWorker_RunWorkerCompleted(ByVal sender As Object, ByVal e As RunWorkerCompletedEventArgs)
			btnGeneratePDF.Enabled = True
			If e.Error IsNot Nothing Then
				MessageBox.Show("Failed: " & e.Error.Message)
			Else
				MessageBox.Show("PDF created: " & e.Result.ToString())
			End If
		End Sub
		Private Sub btnGeneratePDF_Click_1(ByVal sender As Object, ByVal e As EventArgs)
			If Not worker.IsBusy Then
				btnGeneratePDF.Enabled = False
				worker.RunWorkerAsync()
			End If
		End Sub
	End Class
End Namespace
$vbLabelText   $csharpLabel

Sortie de formulaire

!

Sortie PDF

!

Bonnes pratiques

Éviter l'accès à l'interface utilisateur dans DoWork

Le gestionnaire d'événements DoWork s'exécute sur un thread différent, vous ne pouvez donc pas accéder directement aux éléments de l'interface utilisateur. Utilisez RunWorkerCompleted ou des appels Invoke() de contrôle pour des mises à jour sécurisées de l'interface utilisateur.

Soutien pour l'annulation asynchrone

Si votre tâche est longue, activez WorkerSupportsCancellation = true et surveillez CancellationPending à l'intérieur de DoWork pour soutenir l'annulation demandée.

Utiliser les mises à jour de progression du rapport (facultatif)

Vous pouvez activer WorkerReportsProgress = true et utiliser l'événement ProgressChanged pour afficher une barre de progression ou des messages.

Valider l'argument d'entrée

Lors de l'utilisation de RunWorkerAsync(argument), validez l'argument dans DoWork et retournez les résultats de toute méthode via e.Result.

Conclusion

Utiliser BackgroundWorker avec IronPDF vous permet d'effectuer des tâches de rendu PDF lourdes sur un thread en arrière-plan, gardant votre application réactive. Cela est particulièrement précieux lorsque vous travaillez avec des applications WinForms ou WPF qui nécessitent des mises à jour réactives de l'interface utilisateur pendant des tâches de longue durée comme la génération de PDF.

En manipulant le gestionnaire d'événements dowork, en surveillant le résultat final, et en mettant à jour votre interface utilisateur en toute sécurité dans l'événement runworkercompleted, vous assurez que vos opérations en arrière-plan fonctionnent sans accroc.

Bien que async/await soit souvent le choix standard pour les nouvelles applications, BackgroundWorker reste un outil fiable pour les projets hérités ou WinForms. Que vous exportiez des rapports ou génériez des documents à la volée, cette approche vous aidera à tirer le meilleur parti d'IronPDF tout en gardant votre application fluide et conviviale.

Prêt à essayer par vous-même ?

Téléchargez l'essai gratuit d'IronPDF et commencez à créer des solutions PDF puissantes en C# dès aujourd'hui. L'essai vous donne un accès complet aux fonctionnalités présentées dans cet article—sans carte de crédit requise.

Questions Fréquemment Posées

Comment puis-je effectuer la génération de PDF dans une application Windows Forms C# sans bloquer l'interface utilisateur?

Vous pouvez utiliser la classe C# BackgroundWorker en conjonction avec IronPDF pour effectuer la génération de PDF sur un fil séparé. Cela garantit que le fil principal de l'interface utilisateur reste réactif pendant le processus.

Quel est le rôle du gestionnaire d'événements DoWork dans BackgroundWorker?

Le gestionnaire d'événements DoWork est l'endroit où vous exécutez la tâche longue, telle que la génération de PDF avec IronPDF. Il s'exécute sur un fil séparé de l'interface utilisateur, empêchant l'interface de se figer.

Comment puis-je mettre à jour l'interface utilisateur avec les résultats d'une tâche de génération de PDF en arrière-plan?

Utilisez l'événement RunWorkerCompleted pour mettre à jour l'interface utilisateur avec les résultats de votre génération de PDF. Cet événement est déclenché une fois la tâche en arrière-plan terminée, permettant une interaction sécurisée avec les éléments de l'interface.

Quels sont les avantages d'utiliser BackgroundWorker pour le traitement de PDF dans les anciennes applications .NET?

BackgroundWorker offre un moyen simple d'implémenter des opérations asynchrones dans les applications WinForms héritées, fournissant un modèle simple pour gérer des tâches telles que le traitement de PDF avec IronPDF tout en gardant l'interface utilisateur réactive.

Puis-je annuler une tâche de génération de PDF en utilisant BackgroundWorker?

Oui, BackgroundWorker prend en charge l'annulation des tâches. Vous pouvez implémenter l'annulation en vérifiant la propriété CancellationPending dans votre gestionnaire d'événements DoWork et en terminant la tâche en douceur.

Comment puis-je suivre la progression de la génération de PDF en utilisant BackgroundWorker?

Vous pouvez signaler l'avancement depuis la méthode DoWork en utilisant la méthode ReportProgress de BackgroundWorker. Cela vous permet de mettre à jour l'interface utilisateur avec des informations de progression pendant la génération de PDF.

Pourquoi les mises à jour de l'interface utilisateur doivent-elles être évitées dans le gestionnaire d'événements DoWork?

Les mises à jour de l'interface utilisateur doivent être évitées dans le gestionnaire d'événements DoWork car il s'exécute sur un fil séparé. Une manipulation directe de l'interface utilisateur pourrait entraîner des problèmes de threading. Utilisez plutôt les événements RunWorkerCompleted ou ProgressChanged pour les mises à jour de l'interface.

Quelles sont les étapes pour configurer un BackgroundWorker pour la génération de PDF en C#?

La configuration d'un BackgroundWorker implique l'initialisation du travailleur, la gestion des événements DoWork et RunWorkerCompleted, et le démarrage de la tâche en utilisant RunWorkerAsync. Cette configuration est utilisée pour effectuer des tâches telles que la génération de PDF avec IronPDF.

Est-il nécessaire d'utiliser des modèles modernes async/await pour la génération de PDF dans les applications .NET?

Bien que les modèles modernes async/await soient recommandés pour les nouvelles applications, BackgroundWorker reste utile dans les anciennes applications WinForms pour gérer des tâches asynchrones telles que la génération de PDF avec IronPDF, en raison de sa simplicité et de sa facilité d'utilisation.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite