Pruebe en producción sin marcas de agua.
Funciona donde lo necesite.
Obtén 30 días de producto totalmente funcional.
Ténlo en funcionamiento en minutos.
Acceso completo a nuestro equipo de asistencia técnica durante la prueba del producto
Como desarrollador, la programación asíncrona puede ser extremadamente beneficiosa, ya que puede mejorar el rendimiento, la eficiencia y la capacidad de respuesta de sus aplicaciones, en particular las que se ocupan de operaciones que pueden tardar una cantidad impredecible de tiempo en completarse. Al usar `ConfigureAwait(false)`, puedes evitar bloqueos en ciertos escenarios. Los interbloqueos ocurren en la programación asincrónica cuando hay un contexto de sincronización (como un hilo de interfaz de usuario en una aplicación de escritorio) que espera que se complete una operación antes de continuar. Aún así, la tarea esperada está esperando a que el contexto de sincronización esté disponible, creando una espera circular.
Hoy, examinaremos cómo se puede usar ConfigureAwait con IronPDF para realizar eficientemente tareas de procesamiento de PDF mediante programación asincrónica. IronPDF es una biblioteca PDF .NET que facilita el trabajo con tareas relacionadas con PDF. Con un sólido conjunto de funciones, una gran compatibilidad multiplataforma y una extensa documentación, se trata de una potente herramienta PDF que no puede faltar en su kit de herramientas para desarrolladores.
La programación asíncrona se refiere a un método de escribir código que permite que ciertas operaciones se ejecuten independientemente del hilo principal de la aplicación. Esto es útil para tareas de larga duración que requieren espera, como las operaciones de E/S. Al permitir que estas tareas se ejecuten sin bloquear el hilo principal, la aplicación puede seguir ejecutándose mientras estas tareas tardan en completarse, lo que en última instancia mejora el rendimiento y la capacidad de respuesta de la aplicación.
ConfigureAwait es un método en la programación asincrónica utilizado para controlar cómo se ejecuta una continuación. La continuación es el código que se ejecuta después de una expresión await, por defecto **await**
captura el contexto actual e intenta volver a coordinar la continuación a ese contexto, lo que puede ser ineficaz. ConfigureAwait te permite especificar si la continuación debe ejecutarse en el contexto capturado, indicado como **ConfigureAwait(true)**
o no, indicado por **ConfigureAwait(false)**
.
Usar **ConfigureAwait(false)**
ayuda a evitar interbloqueos, esto se debe a que cuando lo usas, le estás indicando a la tarea que no capture el contexto de sincronización actual y que no intente reanudar en el contexto original. Esto permite que la continuación se ejecute en un subproceso del grupo de subprocesos en lugar del contexto original, evitando así que el subproceso principal se bloquee.
`ConfigureAwait(false)` es especialmente útil en el código de la biblioteca o en casos donde reanudar el contexto original no es necesario, asegurando así que el código se mantenga flexible y libre de deadlocks.
Para comenzar a usar IronPDF en sus proyectos .NET, comience instalando el paquete de NuGet de IronPDF. Para ello, vaya a herramientas > NuGet Package Manager > NuGet Package Manager for Solution y busque IronPDF:
También puede ejecutar el siguiente comando en la consola del gestor de paquetes:
Install-Package IronPdf
Install-Package IronPdf
'INSTANT VB TODO TASK: The following line uses invalid syntax:
'Install-Package IronPdf
Para comenzar a usar IronPDF en su código, asegúrese de haber colocado la declaración `using IronPdf` al principio de su archivo de código. Para una guía más detallada sobre cómo configurar IronPDF en su entorno, consulte su página de primeros pasos.
Generar archivos PDF de forma asíncrona puede ser especialmente beneficioso en situaciones en las que se necesita generar grandes cantidades de archivos PDF o se desea realizar varias operaciones simultáneamente. Con IronPDF, puede realizar tareas relacionadas con PDF de forma asíncrona, lo que podría parecerse al siguiente código asíncrono:
using IronPdf;
using System.Threading.Tasks;
class program
{
static async Task Main(string[] args)
{
await GeneratePdfAsync();
}
static async Task GeneratePdfAsync()
{
ChromePdfRenderer renderer = new ChromePdfRenderer();
string htmlContent = "<h1>Hello World!</h1>";
PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);
await Task.Run(() => pdf.SaveAs("outputAsync.pdf"));
Console.WriteLine("Working!");
}
}
using IronPdf;
using System.Threading.Tasks;
class program
{
static async Task Main(string[] args)
{
await GeneratePdfAsync();
}
static async Task GeneratePdfAsync()
{
ChromePdfRenderer renderer = new ChromePdfRenderer();
string htmlContent = "<h1>Hello World!</h1>";
PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync(htmlContent);
await Task.Run(() => pdf.SaveAs("outputAsync.pdf"));
Console.WriteLine("Working!");
}
}
Imports IronPdf
Imports System.Threading.Tasks
Friend Class program
Shared Async Function Main(ByVal args() As String) As Task
Await GeneratePdfAsync()
End Function
Private Shared Async Function GeneratePdfAsync() As Task
Dim renderer As New ChromePdfRenderer()
Dim htmlContent As String = "<h1>Hello World!</h1>"
Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync(htmlContent)
Await Task.Run(Function() pdf.SaveAs("outputAsync.pdf"))
Console.WriteLine("Working!")
End Function
End Class
En este código, hemos creado un documento PDF de manera asíncrona en el método GeneratePdfAsync(). ChromePdfRenderer se utiliza para crear el renderizador que es vital para crear un archivo PDF a partir del contenido HTML. La clase PdfDocument se utiliza para crear un PDF a partir de la cadena HTML proporcionada. Sin embargo, también se puede usar para crear el PDF a partir de un archivo HTML, URL, imagen, y más. Para más información sobre los diferentes métodos de generar un PDF con IronPDF, consulte la sección de cómo hacerlo sobre la generación de PDFs.
Al tratar con archivos PDF grandes, el uso de métodos asincrónicos con `ConfigureAwait(false)` puede mejorar significativamente el rendimiento al liberar el hilo principal durante operaciones prolongadas. Para este ejemplo, he tomado un documento PDF grande y he llevado a cabo una tarea de extracción de texto para demostrar lo beneficioso que es el procesamiento asíncrono de PDF.
using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;
class Program
{
static async Task Main(string[] args)
{
await LongPdfTask();
}
static async Task LongPdfTask()
{
try
{
// Initialize IronPDF's PdfDocument
PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);
// Extract text from PDF asynchronously
string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false);
// Write the extracted text to a file asynchronously
await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false);
Console.WriteLine("Extraction complete!");
}
catch (Exception ex)
{
Console.WriteLine($"Error in GeneratePdfAsync: {ex.Message}");
}
}
}
using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;
class Program
{
static async Task Main(string[] args)
{
await LongPdfTask();
}
static async Task LongPdfTask()
{
try
{
// Initialize IronPDF's PdfDocument
PdfDocument pdf = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false);
// Extract text from PDF asynchronously
string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false);
// Write the extracted text to a file asynchronously
await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false);
Console.WriteLine("Extraction complete!");
}
catch (Exception ex)
{
Console.WriteLine($"Error in GeneratePdfAsync: {ex.Message}");
}
}
}
Imports IronPdf
Imports System.Threading.Tasks
Imports System.IO
Imports System
Friend Class Program
Shared Async Function Main(ByVal args() As String) As Task
Await LongPdfTask()
End Function
Private Shared Async Function LongPdfTask() As Task
Try
' Initialize IronPDF's PdfDocument
Dim pdf As PdfDocument = Await Task.Run(Function() PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(False)
' Extract text from PDF asynchronously
Dim text As String = Await Task.Run(Function() pdf.ExtractAllText()).ConfigureAwait(False)
' Write the extracted text to a file asynchronously
Await Task.Run(Sub() File.WriteAllText("extractedText.txt", text)).ConfigureAwait(False)
Console.WriteLine("Extraction complete!")
Catch ex As Exception
Console.WriteLine($"Error in GeneratePdfAsync: {ex.Message}")
End Try
End Function
End Class
En el código anterior, `ConfigureAwait(false)` se utiliza durante la tarea extensa y que consume mucho tiempo de extraer todo el texto de un archivo PDF grande, que en nuestro caso tenía más de 200 páginas.
Try Block: He envuelto el código dentro del método LongPdfTask en un bloque try-catch para manejar cualquier excepción inesperada de manera elegante.
PdfDocument PDF = await Task.Run(() => PdfDocument.FromFile("Sample.pdf")).ConfigureAwait(false): Esta línea se puede descomponer en tres segmentos diferentes:
PdfDocument.FromFile("Sample.pdf"): Esta sección carga de manera sincrónica el archivo PDF especificado en un objeto IronPdf.PdfDocument.
ConfigureAwait(false) se utiliza mejor cuando estás trabajando en código de biblioteca o en procesamiento en segundo plano, donde el contexto de sincronización no necesita ser conservado. Normalmente, se trata de código de servidor en el que el rendimiento es fundamental. Usar ConfigureAwait(false) significa que cuando la operación await se completa, la continuación no necesariamente se ejecuta en el mismo hilo que inició la operación asincrónica.
Cuando se trata del procesamiento de PDF, implementar ConfigureAwait(false) puede ayudar a maximizar el rendimiento al ejecutar múltiples tareas de procesamiento de PDF para evitar cuellos de botella en relación con el cambio de contexto. También puede ayudar a mantener el buen funcionamiento de la aplicación cuando se procesan grandes cantidades de archivos PDF, y simplemente ayudar a mantener la eficiencia en situaciones en las que se trabaja en aplicaciones de consola o servicios en segundo plano, donde el cambio de contexto podría ser innecesario.
ConfigureAwait(true) se utiliza mejor en la interfaz de usuario, cualquier prueba unitaria para su código, o aplicaciones ASP.NET donde la continuación debe ejecutarse en el mismo contexto, aunque si se usa incorrectamente puede llevar a un bloqueo mutuo. Por ejemplo, si estuvieras actualizando la interfaz de usuario o accediendo a httpcontext). ConfigureAwait(true) es el comportamiento predeterminado, y también podría escribirse simplemente como ConfigureAwait.
Cuando se utiliza con tareas de procesamiento de PDF, puede ser especialmente beneficioso en situaciones como si su código de procesamiento de PDF está estrechamente integrado con la UI (al usar aplicaciones de UI como WPF, WinForms, etc.), como mostrar el progreso, y necesita capturar el contexto de sincronización para asegurar que estas actualizaciones ocurran en el hilo de la UI. También es beneficioso cuando se trabaja con operaciones sensibles a hilos, que deben ejecutarse en un hilo específico debido a requisitos de afinidad de hilos.
El manejo de excepciones en la programación asíncrona es un aspecto importante a tener en cuenta, y requiere una cuidadosa consideración, ya que las excepciones no manejadas pueden terminar la aplicación. El uso de bloques try-catch en el código asíncrono es una buena forma de manejar con elegancia cualquier excepción inesperada.
Por ejemplo:
public async Task SafeGeneratePdfAsync()
{
try
{
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);
await Task.Run(() => pdf.SaveAs("output.pdf")).ConfigureAwait(false);
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
public async Task SafeGeneratePdfAsync()
{
try
{
ChromePdfRenderer renderer = new ChromePdfRenderer();
PdfDocument pdf = await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(false);
await Task.Run(() => pdf.SaveAs("output.pdf")).ConfigureAwait(false);
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred: {ex.Message}");
}
}
Public Async Function SafeGeneratePdfAsync() As Task
Try
Dim renderer As New ChromePdfRenderer()
Dim pdf As PdfDocument = Await renderer.RenderHtmlAsPdfAsync("<h1>Error Handling</h1>").ConfigureAwait(False)
Await Task.Run(Function() pdf.SaveAs("output.pdf")).ConfigureAwait(False)
Catch ex As Exception
Console.WriteLine($"An error occurred: {ex.Message}")
End Try
End Function
Al usar tareas de continuación con `ConfigureAwait(false)`, las excepciones pueden manejarse usando try-catch dentro de la continuación, o mediante la propiedad Task.Exception si se usa Task.ContinueWith.
Un ejemplo de cómo se podría escribir el código para hacer esto podría ser el siguiente:
class program
{
public static async Task Main(string[] args)
{
await ProcessPdfWithContinuationAsync();
}
static Task ProcessPdfWithContinuationAsync()
{
return Task.Run(() => PdfDocument.FromFile("Sample.pdf"))
.ContinueWith(pdfTask =>
{
if (pdfTask.IsFaulted)
{
// Handle exceptions from loading the PDF
Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}");
return;
}
var pdf = pdfTask.Result;
// Extract text asynchronously with exception handling
Task.Run(() => pdf.ExtractAllText())
.ContinueWith(extractTask =>
{
if (extractTask.IsFaulted)
{
// Handle exceptions from extracting text
Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}");
return;
}
// Proceed if text extraction is successful
Console.WriteLine("Extracted text:");
Console.WriteLine(extractTask.Result);
}, TaskContinuationOptions.OnlyOnRanToCompletion);
}, TaskContinuationOptions.OnlyOnRanToCompletion);
}
class program
{
public static async Task Main(string[] args)
{
await ProcessPdfWithContinuationAsync();
}
static Task ProcessPdfWithContinuationAsync()
{
return Task.Run(() => PdfDocument.FromFile("Sample.pdf"))
.ContinueWith(pdfTask =>
{
if (pdfTask.IsFaulted)
{
// Handle exceptions from loading the PDF
Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}");
return;
}
var pdf = pdfTask.Result;
// Extract text asynchronously with exception handling
Task.Run(() => pdf.ExtractAllText())
.ContinueWith(extractTask =>
{
if (extractTask.IsFaulted)
{
// Handle exceptions from extracting text
Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}");
return;
}
// Proceed if text extraction is successful
Console.WriteLine("Extracted text:");
Console.WriteLine(extractTask.Result);
}, TaskContinuationOptions.OnlyOnRanToCompletion);
}, TaskContinuationOptions.OnlyOnRanToCompletion);
}
Friend Class program
Public Shared Async Function Main(ByVal args() As String) As Task
Await ProcessPdfWithContinuationAsync()
End Function
Private Shared Function ProcessPdfWithContinuationAsync() As Task
Return Task.Run(Function() PdfDocument.FromFile("Sample.pdf")).ContinueWith(Sub(pdfTask)
If pdfTask.IsFaulted Then
' Handle exceptions from loading the PDF
Console.WriteLine($"Error loading PDF: {pdfTask.Exception?.GetBaseException().Message}")
Return
End If
Dim pdf = pdfTask.Result
' Extract text asynchronously with exception handling
Task.Run(Function() pdf.ExtractAllText()).ContinueWith(Sub(extractTask)
If extractTask.IsFaulted Then
' Handle exceptions from extracting text
Console.WriteLine($"Error extracting text: {extractTask.Exception?.GetBaseException().Message}")
Return
End If
' Proceed if text extraction is successful
Console.WriteLine("Extracted text:")
Console.WriteLine(extractTask.Result)
End Sub, TaskContinuationOptions.OnlyOnRanToCompletion)
End Sub, TaskContinuationOptions.OnlyOnRanToCompletion)
End Function
IronPDF es una potente biblioteca PDF en C# que ofrece un amplio conjunto de funciones para todas las tareas relacionadas con PDF. Con compatibilidad total con .NET 8, 7, 6, .NET Core, Standard y Framework, y capaz de ejecutarse en diversos entornos de aplicaciones como Windows, Linux, Mac, Docker, Azure y AWS, podrá sacar el máximo partido de IronPDF sea cual sea su entorno preferido.
Con IronPDF, puedes generar PDFs a partir de varios tipos de archivos y datos; incluyendo archivos HTML, cadena HTML, URLs, imágenes, DOCX, y RTF, ¡a menudo en solo unas pocas líneas de código! Puede gestionar el formato de sus documentos PDF, aplicar marcas de agua personalizadas, combinar y dividir PDFs, manejar la cifrado de PDF y seguridad, y más.
IronPDF proporciona métodos asíncronos para muchas de sus operaciones, lo que permite a los desarrolladores aprovechar los patrones async/await sin problemas. Esta compatibilidad garantiza que IronPDF pueda integrarse en aplicaciones de rendimiento crítico sin sacrificar la capacidad de respuesta, lo que la convierte en una herramienta PDF inestimable para los desarrolladores que trabajan en tareas relacionadas con PDF en un entorno asíncrono.
Si deseas probar IronPDF por ti mismo y explorar su amplia gama de características, puedes hacerlo fácilmente gracias a su período de prueba gratuita. Con su rápida y sencilla instalación, podrás tener IronPDF funcionando en tus proyectos PDF en muy poco tiempo. ¿Quiere seguir utilizándolo y aprovechar sus potentes funciones para subir de nivel en sus proyectos PDF? Licencias comienzan desde solo $749, e incluyen una generosa garantía de devolución de dinero de 30 días, un año completo de soporte y actualizaciones de producto, y se ofrecen como una licencia perpetua (¡Así que no hay molestos cargos recurrentes!)
Para generar un PDF de forma asincrónica, usaremos IronPDF para ejecutar el código que renderiza el archivo HTML y guardar el resultado, mientras utilizamos ConfigureAwait(false) para asegurar que la continuación no cambie innecesariamente al contexto de sincronización original.
using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;
class program
{
public static async Task Main(string[] args)
{
await CreateInvoicePdfAsync();
}
static async Task<string> CreateInvoicePdfAsync()
{
ChromePdfRenderer renderer = new ChromePdfRenderer();
try
{
var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);
await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);
return filePath;
}
catch (Exception ex)
{
Console.WriteLine($"Error generating PDF: {ex.Message}");
return null;
}
}
}
using IronPdf;
using System.Threading.Tasks;
using System.IO;
using System;
class program
{
public static async Task Main(string[] args)
{
await CreateInvoicePdfAsync();
}
static async Task<string> CreateInvoicePdfAsync()
{
ChromePdfRenderer renderer = new ChromePdfRenderer();
try
{
var pdf = await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(false);
await Task.Run(() => pdf.SaveAs("invoice.pdf")).ConfigureAwait(false);
return filePath;
}
catch (Exception ex)
{
Console.WriteLine($"Error generating PDF: {ex.Message}");
return null;
}
}
}
Imports IronPdf
Imports System.Threading.Tasks
Imports System.IO
Imports System
Friend Class program
Public Shared Async Function Main(ByVal args() As String) As Task
Await CreateInvoicePdfAsync()
End Function
Private Shared Async Function CreateInvoicePdfAsync() As Task(Of String)
Dim renderer As New ChromePdfRenderer()
Try
Dim pdf = Await renderer.RenderHtmlFileAsPdfAsync("example.html").ConfigureAwait(False)
Await Task.Run(Function() pdf.SaveAs("invoice.pdf")).ConfigureAwait(False)
Return filePath
Catch ex As Exception
Console.WriteLine($"Error generating PDF: {ex.Message}")
Return Nothing
End Try
End Function
End Class
En este ejemplo, estamos utilizando el método asíncrono que creamos, static async Task
También hemos implementado de nuevo el método await Task.Run(() => ...) para ejecutar las operaciones de forma asíncrona. Finalmente, hemos guardado el archivo PDF recién generado como "invoice.pdf" utilizando el método pdf.SaveAs. Todo el código dentro del método CreateInvoicePdfAsync() ha sido envuelto dentro de un bloque try-catch para manejar cualquier excepción inesperada.
Como puede ver, generamos con éxito el archivo HTML en un PDF de forma asíncrona, y nos creó un archivo PDF claro y de alta calidad.
La programación asíncrona es esencial para construir aplicaciones .NET receptivas y eficientes y usar ConfigureAwait correctamente puede ayudarte a lograr un rendimiento óptimo, especialmente al escribir código a nivel de aplicación. Al trabajar con IronPDF, utilizar métodos asincrónicos junto con ConfigureAwait(false) garantiza que tus tareas de procesamiento de PDF no bloqueen el hilo principal, mejorando la capacidad de respuesta general de tu aplicación. Al entender cuándo y cómo usar ConfigureAwait, puedes hacer que tus tareas de procesamiento de PDF con IronPDF sean más robustas y amigables con el rendimiento.
Ahora puedes avanzar como profesionales utilizando ConfigureAwait junto con IronPDF en la programación asincrónica, ¿así que a qué esperas? ¡Prueba IronPDF hoy para ver cómo puede mejorar tus proyectos relacionados con PDF! Si desea obtener más información sobre la amplia gama de funciones que IronPDF ofrece como código de biblioteca de propósito general potente, asegúrese de consultar sus útiles guías prácticas. O, si desea leer más sobre el uso de IronPDF junto con métodos de programación asincrónica, o simplemente quiere aprender más sobre IronPDF en general, consulte nuestras entradas de blog. Si estás buscando más ejemplos de generación de PDF de manera asincrónica, visita nuestra publicación C# Wait For Seconds, o nuestra otra sobre C# Task.Run.