using IronPdf;
// Disable local disk access or cross-origin requests
Installation.EnableWebSecurity = true;
// Instantiate Renderer
var renderer = new ChromePdfRenderer();
// Create a PDF from a HTML string using C#
var pdf = renderer.RenderHtmlAsPdf("<h1>Hello World</h1>");
// Export to a file or Stream
pdf.SaveAs("output.pdf");
// Advanced Example with HTML Assets
// Load external html assets: Images, CSS and JavaScript.
// An optional BasePath 'C:\site\assets\' is set as the file location to load assets from
var myAdvancedPdf = renderer.RenderHtmlAsPdf("<img src='icons/iron.png'>", @"C:\site\assets\");
myAdvancedPdf.SaveAs("html-with-assets.pdf");
C# Interlocked (Comment cela fonctionne pour les développeurs)
Chaknith Bin
avril 3, 2025
Partager:
Lorsque vous travaillez avec des applications multi-thread, garantir la sécurité des threads devient un facteur crucial pour prévenir les conditions de concurrence et la corruption de données. Dans le monde du traitement 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 simultanément peut entraîner des résultats inattendus si la synchronisation appropriée n'est pas maintenue. C'est là que la classe Interlocked de C# entre en jeu, offrant un moyen simple et efficace de garantir des opérations thread-safe dans un environnement multi-thread.
Qu'est-ce que la classe Interlocked en C# ?
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 perturbées par un autre, ce qui est essentiel lorsque vous devez assurer 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, modifier et manipuler des fichiers 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 gérer les tâches PDF dans la programmation concurrente. Mais comment cela fonctionne-t-il, et pourquoi devriez-vous vous en soucier ? Plongeons plus profondément dans le rôle de Interlocked dans le traitement IronPDF.
IronPDF : La bibliothèque PDF tout-en-un pour C
Ajouter depuis PixabayTéléverser
ou faites glisser et déposez une image ici
Ajouter un texte alternatif à l'image
IronPDF est une bibliothèque polyvalente et riche en fonctionnalités conçue pour fonctionner de manière transparente avec les applications C# et .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. Ci-dessous quelques caractéristiques clés de IronPDF :
Conversion HTML en PDF : IronPDF vous permet de convertir du contenu HTML en PDF de haute qualité. Ceci 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 les fusionnant, scindant ou en extrayant des pages. De plus, IronPDF vous permet de modifier le contenu des PDF, comme ajouter du texte, des images ou des annotations.
Formulaires et champs PDF : IronPDF prend en charge le travail avec les formulaires PDF, y compris le remplissage programmatique des champs de formulaire. Ceci est idéal pour automatiser le processus de génération de documents tels que les enquêtes, les applications et les contrats.
Signatures numériques : Il propose des fonctionnalités pour signer des PDFs numériquement avec une signature sécurisée, ce qui est une fonctionnalité essentielle pour les industries nécessitant des transactions de documents sécurisées, telles que les secteurs juridiques et financiers.
En tirant parti de ces fonctionnalités, IronPDF aide les développeurs à créer, gérer et automatiser efficacement les flux de travail PDF, 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 IronPDF ?
Sécurité des threads et concurrence
Dans les applications multithread, plusieurs threads peuvent tenter d'accéder et de modifier des données partagées en même temps. Sans une synchronisation adéquate, cela pourrait entraîner des problèmes tels que des conditions de compétition, où deux threads essaient de mettre à jour les mêmes données simultanément. Cela peut entraîner des résultats imprévisibles et des erreurs difficiles à déboguer.
La classe Interlocked garantit que ces opérations concurrentes sont traité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 et ininterrompue, ce qui élimine le risque de condition de concurrence.
Dans le contexte d'IronPDF, de nombreuses tâches de traitement PDF—telles que l'ajout de pages, l'édition de contenu, ou la génération de PDFs à partir de plusieurs sources—sont des candidates idéales pour le traitement en parallèle. Sans synchronisation, l'exécution de ces opérations simultanément pourrait entraîner des fichiers PDF corrompus ou des erreurs lors du traitement. L'utilisation d'Interlocked garantit que ces opérations restent sécurisées, même dans un environnement multi-thread.
Utilisation de Interlocked avec différents types de données
Lorsqu'on manipule des 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 nécessaire pour l'opération.
Valeur d'origine : Lors de la réalisation de mises à jour, il est important de travailler avec la valeur d'origine avant d'apporter des modifications pour garantir la cohérence dans les opérations de thread.
Classe publique statique : Vous pouvez créer une classe publique statique pour encapsuler vos opérations Interlocked, rendant votre code plus modulaire et plus facile à maintenir.
Valeur double : Interlocked ne prend pas directement en charge les valeurs de type double, car le type 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 le problème 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 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 Module
Quand utiliser Interlocked avec IronPDF
Vous devriez utiliser Interlocked dans tout scénario où plusieurs threads travaillent avec des ressources partagées. En voici quelques exemples :
Suivi des numéros de page dans la génération de PDF.
Gestion des compteurs ou des listes qui sont consultés et modifiés par plusieurs threads.
En utilisant Interlocked pour ces opérations, vous vous assurez que les mises à jour sont thread-safe, évitant les conflits et garantissant l'intégrité des données.
Implémentation de Interlocked avec IronPDF
Utilisation basique de Interlocked en C
La classe Interlocked offre plusieurs méthodes pour effectuer des opérations atomiques sur des variables, telles que :
Ajouter : Ajoute 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émenter : Augmente une valeur int 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é de manière sécurisée dans un environnement multi-thread, utilisez Interlocked.Increment :
int counter = 0;
Interlocked.Increment(ref counter);
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 Thread-Safe avec IronPDF et C# Interlocked
Examinons un exemple pratique d'utilisation de Interlocked avec IronPDF dans un contexte multi-thread. 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 l'implémenter :
using IronPdf;
using System;
using System.Threading;
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}");
}
}
using IronPdf;
using System;
using System.Threading;
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
Friend Class Program
Private Shared pageCount As Integer = 0
Private Shared ReadOnly lockObject As New Object() ' Object for locking
Shared Sub Main()
Dim threads = New Thread(4){}
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 i
' Wait for all threads to complete
For Each thread In threads
thread.Join()
Next thread
' 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 i
' Save the merged PDF
finalPdf.SaveAs("MergedGeneratedPDF.pdf")
Console.WriteLine("All PDFs merged and saved successfully.")
End Sub
Private Shared Sub GeneratePdf(ByVal 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 Class
Explication du code
Ce programme C# génère plusieurs PDF en parallèle en utilisant des threads, puis les fusionne en un seul PDF à l'aide d'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 déclaration de verrouillage pour éviter les conditions de course lors de l'ajout de PDFs à la liste.
Fusion de PDFs : Une fois que tous les threads sont terminés, les PDFs dans 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 se terminent en utilisant thread.Join() avant de procéder à la fusion.
Sortie de la console
Ajouter depuis PixabayTéléverser
ou faites glisser et déposez une image ici
Effacer le texte alternatif
Sortie PDF
Ajouter depuis PixabayTéléverser
ou faites glisser et déposez une image ici
Effacer le texte alternatif
Pourquoi c'est sécurisé pour les threads
Modification de liste sécurisée pour les threads : L'utilisation de lock garantit que la modification de la liste partagée pdfList est sécurisée, empêchant plusieurs threads d'ajouter à la liste simultanément 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'appels I/O ou 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 la manipulation 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 toujours gérer les erreurs potentielles dans votre logique de génération de PDF. Vous pouvez utiliser des blocs try-catch pour gérer les exceptions de manière élégante :
Try
finalPdf.SaveAs(fileName)
Catch ex As Exception
Console.WriteLine($"Error generating PDF: {ex.Message}")
End Try
Considérations de performance : Bien que Interlocked soit optimisé pour les opérations atomiques, une synchronisation excessive peut introduire des surcharges. Si vous gérez un grand volume d'opérations simultanées, vous devez minimiser la synchronisation sur les variables partagées les plus critiques pour réduire la contention.
Conclusion
La sécurité des threads est cruciale dans les applications multi-thread, surtout lorsqu'il s'agit de gérer des ressources partagées telles que les compteurs ou les listes. Lorsque vous utilisez IronPDF pour la création ou la manipulation de PDF, l'intégration d'Interlocked garantit que les opérations restent thread-safe et fiables.
En utilisant Interlocked en conjonction avec IronPDF, les développeurs .NET peuvent efficacement faire évoluer leurs flux de travail de traitement PDF tout en préservant l'intégrité des données. Que vous génériez des rapports, fusionniez des documents ou effectuiez des manipulations complexes de PDF en parallèle, Interlocked aide à maintenir la cohérence et à éviter les conditions de concurrence.
Avec ces meilleures pratiques, vous pouvez tirer pleinement parti des capacités d'IronPDF et garantir que vos flux de travail PDF multithreads sont efficaces et robustes. Prêt à commencer l'intégration d'IronPDF aujourd'hui et à découvrir par vous-même ses puissantes fonctionnalités de création et de manipulation de PDF !
Chaknith travaille sur IronXL et IronBarcode. Il possède une expertise approfondie en C# et .NET, aidant à améliorer le logiciel et à soutenir les clients. Ses idées issues des interactions avec les utilisateurs contribuent à de meilleurs produits, une documentation améliorée et une expérience globale enrichie.
SUIVANT > Méthodes de chaîne C# (Comment cela fonctionne pour les développeurs)
Des millions d'ingénieurs dans le monde entier lui font confiance
Réservez une démo en direct gratuite
Réservez une démonstration personnelle de 30 minutes.
Pas de contrat, pas de détails de carte, pas d'engagements.
Voici ce à quoi vous pouvez vous attendre :
Une démonstration en direct de notre produit et de ses principales fonctionnalités
Obtenez des recommandations de fonctionnalités spécifiques au projet
Toutes vos questions trouvent réponse pour vous assurer de disposer de toutes les informations dont vous avez besoin. (Aucun engagement de votre part.)
CHOISIR L'HEURE
VOS INFORMATIONS
Réservez votre démo en direct gratuite
Fiable par plus de 2 millions d'ingénieurs dans le monde entier