
C# Interlocked (Comment ça fonctionne pour les développeurs)
Lors de l'utilisation d'applications multithread, assurer la sécurité des threads devient un facteur crucial pour prévenir les conditions de compétition et la corruption des données. Dans le monde de la manipulation des PDF avec IronPDF, ce problème n'est pas différent. Que vous génériez, manipuliez ou combiniez des PDF, exécuter ces tâches en parallèle peut entraîner des résultats inattendus si une synchronisation adéquate n'est pas maintenue. C'est là que la classe Interlocked de C# entre en jeu, offrant un moyen simple et efficace d'assurer des opérations sûres pour les threads dans un environnement multithread.
Qu'est-ce que la classe C# Interlocked ?
En C#, la classe Interlocked fournit des opérations atomiques pour les variables partagées par plusieurs threads. Cela garantit que les actions d'un thread ne seront pas interférées par un autre, ce qui est essentiel lorsque vous devez garantir que les opérations sont effectuées de manière contrôlée et cohérente. D'autre part, IronPDF est une bibliothèque puissante qui permet aux développeurs .NET de créer, éditer et manipuler des PDF.
Lorsque vous combinez les deux - Interlocked pour la sécurité des threads et IronPDF pour les opérations PDF - vous obtenez une solution puissante pour traiter les tâches PDF dans la programmation concurrente. Mais comment cela fonctionne-t-il, et pourquoi devriez-vous vous en préoccuper ? Plongeons plus profondément dans le rôle d'Interlocked dans le traitement d'IronPDF.
IronPDF : La bibliothèque PDF C# tout-en-un

IronPDF est une bibliothèque polyvalente et riche en fonctionnalités conçue pour fonctionner sans heurts avec le C# et les applications .NET pour la génération et la manipulation de PDF. Sa simplicité et ses performances en font un choix populaire pour les développeurs qui ont besoin d'automatiser les tâches PDF. Voici quelques caractéristiques clés d'IronPDF :
- Conversion HTML vers PDF : IronPDF vous permet de convertir du contenu HTML en PDF de haute qualité. Cela est particulièrement utile pour créer des rapports, des factures et tout contenu rendu en HTML.
- Édition et manipulation de PDF : Vous pouvez manipuler des documents PDF existants en fusionnant , en divisant ou en extrayant des pages. De plus, IronPDF vous permet de modifier le contenu des PDFs, par exemple en ajoutant du texte, des images ou des annotations.
- Formulaires et champs PDF : IronPDF prend en charge l'utilisation des formulaires PDF , y compris le remplissage programmatique des champs de formulaire . Cela est idéal pour automatiser le processus de génération de documents tels que des enquêtes, des applications et des contrats.
- Signatures numériques : Cette fonctionnalité permet de signer numériquement des PDF avec une signature sécurisée, ce qui est essentiel pour les secteurs exigeant des transactions documentaires sécurisées, tels que les secteurs juridique et financier.
En tirant parti de ces caractéristiques, IronPDF aide les développeurs à créer, gérer et automatiser les flux de travail PDF efficacement, tout en garantissant des résultats de haute qualité. Que vous travailliez avec du contenu HTML dynamique ou manipuliez des documents existants, IronPDF fournit les outils nécessaires pour rationaliser vos tâches liées aux PDF.
Pourquoi Utiliser Interlocked dans le Traitement des IronPDF?
Sécurité des Threads et Concurrence
Dans des applications multithreads, plusieurs threads peuvent tenter d'accéder et de modifier les données partagées en même temps. Sans synchronisation adéquate, cela pourrait entraîner des problèmes tels que les conditions de compétition, où deux threads essaient de mettre à jour les mêmes données simultanément. Cela peut causer des résultats imprévisibles et des erreurs difficiles à déboguer.
La classe Interlocked garantit que ces opérations concurrentes sont gérées de manière atomique. En d'autres termes, lorsque vous utilisez Interlocked pour modifier la valeur d'un objet, le changement se produit comme une opération unique, ininterrompue, ce qui élimine le risque de condition de compétition.
Dans le contexte d'IronPDF, de nombreuses tâches de traitement des PDF - telles que l'ajout de pages, l'édition de contenu ou la génération de PDF à partir de sources multiples - sont des candidats idéaux pour le traitement parallèle. Sans synchronisation, exécuter ces opérations en parallèle pourrait entraîner des fichiers PDF corrompus ou des erreurs lors du traitement. L'utilisation d'Interlocked garantit que ces opérations restent sûres, même dans un environnement multithread.
Utilisation d'Interlocked avec Différents Types de Données
Lorsqu'il s'agit de variables de différents types de données, Interlocked peut être utilisé pour gérer en toute sécurité les mises à jour concurrentes. Explorons certains des types de données que vous pourriez rencontrer :
- Valeur flottante : La méthode Interlocked.CompareExchange peut être utilisée avec des valeurs à virgule flottante lorsqu'un type de référence est requis pour l'opération.
- Valeur d'origine : lors des mises à jour, il est important de travailler avec la valeur d'origine avant d'apporter des modifications afin de garantir la cohérence des opérations entre les threads.
- Classe statique publique : Vous pouvez créer une classe statique publique pour encapsuler vos opérations Interlocked, ce qui rend votre code plus modulaire et plus facile à maintenir.
- Valeur double : Interlocked ne prend pas directement en charge les valeurs double, car double n'est pas un type entier et les opérations atomiques sont optimisées pour les entiers. Si vous avez besoin d'opérations atomiques sur des valeurs double, vous pouvez contourner cela en utilisant des valeurs long et en convertissant manuellement entre les valeurs double et long.
public static class ThreadSafeOperations
{
private static int counter = 0;
public static void IncrementCounter()
{
// Safely increment the counter using Interlocked
Interlocked.Increment(ref counter);
}
}Public Module ThreadSafeOperations
Private counter As Integer = 0
Public Sub IncrementCounter()
' Safely increment the counter using Interlocked
Interlocked.Increment(counter)
End Sub
End ModuleQuand Utiliser Interlocked avec IronPDF
Vous devriez utiliser Interlocked dans tout scénario où plusieurs threads travaillent avec des ressources partagées. Les exemples incluent :
- Suivi des numéros de page dans la génération de PDF.
- Gestion de compteurs ou de listes qui sont accédés et modifiés par plusieurs threads.
En utilisant Interlocked pour ces opérations, vous assurez que les mises à jour sont sécurisées pour les threads, empêchant les conflits et garantissant l'intégrité des données.
Implémentation d'Interlocked avec IronPDF
Basic Usage of Interlocked in C#
La classe Interlocked offre plusieurs méthodes pour effectuer des opérations atomiques sur des variables, telles que :
- Additionner : Additionne deux entiers et stocke le résultat dans une variable.
- CompareExchange : Compare deux valeurs pour vérifier leur égalité et, si elles sont égales, remplace l'une des valeurs.
- Incrémentation : Augmente une valeur entière de un et renvoie la nouvelle valeur.
- Décrémentation : Diminue une valeur entière de un et renvoie la nouvelle valeur.
Par exemple, si vous avez besoin d'incrémenter un compteur partagé en toute sécurité dans un environnement multithread, utilisez Interlocked.Increment :
int counter = 0;
Interlocked.Increment(ref counter);Dim counter As Integer = 0
Interlocked.Increment(counter)Cela garantit que le compteur est incrémenté en toute sécurité, même lorsque plusieurs threads le modifient simultanément.
Génération de PDF sécurisée pour les threads avec IronPDF et C# Interlocked
Voyons un exemple pratique de l'utilisation d'Interlocked avec IronPDF dans un contexte multithread. Supposons que vous génériez des fichiers PDF dans des threads parallèles et que chaque thread ait besoin d'un identifiant unique ou d'un numéro de page.
Voici comment vous pouvez implémenter cela :
using IronPdf;
using System;
using System.Threading;
using System.Collections.Generic;
class Program
{
static int pageCount = 0;
static readonly object lockObject = new object(); // Object for locking
static void Main()
{
var threads = new Thread[5];
List<PdfDocument> pdfList = new List<PdfDocument>();
// Create threads for parallel PDF generation
for (int i = 0; i < threads.Length; i++)
{
threads[i] = new Thread(() => GeneratePdf(pdfList));
threads[i].Start();
}
// Wait for all threads to complete
foreach (var thread in threads)
{
thread.Join();
}
// Merge all the generated PDFs
PdfDocument finalPdf = pdfList[0]; // Start with the first document
// Merge remaining PDFs into finalPdf
for (int i = 1; i < pdfList.Count; i++)
{
finalPdf = PdfDocument.Merge(finalPdf, pdfList[i]);
}
// Save the merged PDF
finalPdf.SaveAs("MergedGeneratedPDF.pdf");
Console.WriteLine("All PDFs merged and saved successfully.");
}
static void GeneratePdf(List<PdfDocument> pdfList)
{
// Use ChromePdfRenderer instead of HtmlToPdf
ChromePdfRenderer renderer = new ChromePdfRenderer();
// Use Interlocked to ensure unique page number per thread and using a "ref object" to reference the pageCount object
int pageNum = Interlocked.Increment(ref pageCount);
// Generate a PDF page using ChromePdfRenderer
var pdfPage = renderer.RenderHtmlAsPdf($"Page {pageNum} generated by thread {Thread.CurrentThread.ManagedThreadId}");
// Add generated PDF page to the list (thread-safe)
lock (lockObject) // Ensure thread-safety when adding to shared list
{
pdfList.Add(pdfPage);
}
string fileName = $"GeneratedPDF_{pageNum}.pdf";
pdfPage.SaveAs(fileName);
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} generated: {fileName}");
}
}Imports IronPdf
Imports System
Imports System.Threading
Imports System.Collections.Generic
Module Program
Private pageCount As Integer = 0
Private ReadOnly lockObject As New Object() ' Object for locking
Sub Main()
Dim threads(4) As Thread
Dim pdfList As New List(Of PdfDocument)()
' Create threads for parallel PDF generation
For i As Integer = 0 To threads.Length - 1
threads(i) = New Thread(Sub() GeneratePdf(pdfList))
threads(i).Start()
Next
' Wait for all threads to complete
For Each thread As Thread In threads
thread.Join()
Next
' Merge all the generated PDFs
Dim finalPdf As PdfDocument = pdfList(0) ' Start with the first document
' Merge remaining PDFs into finalPdf
For i As Integer = 1 To pdfList.Count - 1
finalPdf = PdfDocument.Merge(finalPdf, pdfList(i))
Next
' Save the merged PDF
finalPdf.SaveAs("MergedGeneratedPDF.pdf")
Console.WriteLine("All PDFs merged and saved successfully.")
End Sub
Sub GeneratePdf(pdfList As List(Of PdfDocument))
' Use ChromePdfRenderer instead of HtmlToPdf
Dim renderer As New ChromePdfRenderer()
' Use Interlocked to ensure unique page number per thread and using a "ref object" to reference the pageCount object
Dim pageNum As Integer = Interlocked.Increment(pageCount)
' Generate a PDF page using ChromePdfRenderer
Dim pdfPage = renderer.RenderHtmlAsPdf($"Page {pageNum} generated by thread {Thread.CurrentThread.ManagedThreadId}")
' Add generated PDF page to the list (thread-safe)
SyncLock lockObject ' Ensure thread-safety when adding to shared list
pdfList.Add(pdfPage)
End SyncLock
Dim fileName As String = $"GeneratedPDF_{pageNum}.pdf"
pdfPage.SaveAs(fileName)
Console.WriteLine($"Thread {Thread.CurrentThread.ManagedThreadId} generated: {fileName}")
End Sub
End ModuleExplication du code
Ce programme C# génère plusieurs PDF en parallèle en utilisant des threads, puis les fusionne en un seul PDF en utilisant IronPDF.
- Multithreading : 5 threads sont créés pour générer des PDF simultanément. Chaque thread obtient un numéro de page unique en utilisant Interlocked.Increment.
- Sécurité des threads : l'accès à la liste pdfList partagée est synchronisé avec une instruction de verrouillage afin d'éviter les conditions de concurrence lors de l'ajout de fichiers PDF à la liste.
- Fusion des PDF : Une fois tous les threads terminés, les PDF de pdfList sont fusionnés séquentiellement à l'aide de PdfDocument.Merge, et le PDF final est enregistré.
- Synchronisation : Le thread principal attend que tous les threads aient terminé leur exécution à l'aide de thread.Join() avant de procéder à la fusion.
Sortie Console

Sortie PDF

Pourquoi C'est Sûr pour les Threads
- Modification de liste sécurisée pour les threads : l'utilisation d'un verrou garantit que la modification de la liste pdfList partagée est sécurisée, empêchant ainsi plusieurs threads d'ajouter simultanément des éléments à la liste et de provoquer des conditions de concurrence.
- Pas besoin de code asynchrone : le code ne nécessite pas async/await car les opérations sont séquentielles et n'impliquent pas d'E/S ou d'appels réseau de longue durée. La principale préoccupation ici est de s'assurer que l'accès aux données partagées (la liste) est correctement synchronisé.
Gestion des Erreurs et Considérations de Performance
Lors de l'utilisation de code multithread, la gestion des erreurs et l'optimisation des performances sont essentielles.
- Gestion des erreurs : Bien qu'Interlocked assure la sécurité des threads, vous devez tout de même gérer les erreurs potentielles dans votre logique de génération de PDF. Vous pouvez utiliser des blocs try-catch pour gérer gracieusement les exceptions :
try
{
finalPdf.SaveAs(fileName);
}
catch (Exception ex)
{
Console.WriteLine($"Error generating PDF: {ex.Message}");
}Try
finalPdf.SaveAs(fileName)
Catch ex As Exception
Console.WriteLine($"Error generating PDF: {ex.Message}")
End Try- Considérations relatives aux performances : Bien qu'Interlocked soit optimisé pour les opérations atomiques, une synchronisation excessive peut engendrer une surcharge. Si vous gérez un grand volume d'opérations concurrentes, vous devez minimiser la synchronisation aux variables partagées les plus critiques pour réduire la contention.
Conclusion
La sécurité des threads est cruciale dans les applications multithread, surtout quand il s'agit de ressources partagées comme les compteurs ou les listes. Lorsque vous utilisez IronPDF pour la création ou la manipulation de PDF, intégrer Interlocked assure que les opérations restent sûres pour les threads et fiables.
En utilisant Interlocked conjointement avec IronPDF, les développeurs .NET peuvent augmenter efficacement leurs flux de travail de traitement PDF tout en maintenant l'intégrité des données. Que vous génériez des rapports, fusionniez des documents ou effectuiez des manipulations PDF complexes en parallèle, Interlocked aide à maintenir la cohérence et éviter les conditions de compétition.
Avec ces meilleures pratiques, vous pouvez tirer pleinement parti des capacités d'IronPDF et vous assurer que vos flux de travail PDF multithread sont efficaces et robustes. Prêt à commencer à intégrer IronPDF dès aujourd'hui et à découvrir ses fonctionnalités puissantes de création et de manipulation de PDF par vous-même !

Jacob Mellor est directeur de la technologie chez Iron Software et un ingénieur visionnaire pionnier de la technologie C# PDF. En tant que développeur à l'origine de la base de code centrale d'Iron Software, il a façonné l'architecture des produits de l'entreprise depuis sa création, la transformant aux côtés du PDG Cameron Rimington en une entreprise de plus de 50 personnes au service de la NASA, de Tesla et d'agences gouvernementales mondiales.
Articles connexes


