Pruebas en un entorno real
Pruebe en producción sin marcas de agua.
Funciona donde lo necesites.
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. Utilizando `ConfigureAwait(falso), puede evitar bloqueos en determinados escenarios. Los bloqueos se producen en la programación asíncrona cuando existe 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ómoConfigureAwait puede utilizarse con IronPDF para realizar con eficacia tareas de procesamiento de PDF mediante programación asíncrona. 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 de programación asíncrona 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 y trata de marshal la continuación de nuevo a ese contexto que puede ser ineficaz. ConfigureAwait permite especificar si la continuación debe ejecutarse en el contexto capturado, indicado como `ConfigureAwait(verdadero)**ConfigureAwait(falso)**`.
Uso de **ConfigureAwait(falso)**` ayuda a evitar bloqueos, esto se debe a que cuando se utiliza, se le está diciendo 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(falso)**\Es especialmente útil en el código de bibliotecas o en casos en los que no es necesario reanudar el contexto original, lo que garantiza que el código siga siendo flexible y libre de bloqueos.
Para empezar a utilizar IronPDF en sus proyectos .NET, instale la aplicaciónPaquete NuGet 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 empezar a utilizar IronPDF en su código, asegúrese de que ha colocado la declaración "using IronPdf" en la parte superior de su archivo de código. Para obtener una guía más detallada sobre la configuración de IronPDF en su entorno, consulte su sitio webcómo empezar página.
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 forma asíncrona en el comando GeneratePdfAsync() método. ChromePdfRenderer se utiliza para crear el renderizador que es vital para crear un archivo PDF a partir del contenido HTML. EnDocumentoPdf se utiliza para crear un PDF a partir de la claseCadena HTMLsin embargo, también se podría utilizar para crear el PDF a partir de unArchivo HTML, URL, imageny mucho más. Para obtener más información sobre los distintos métodos de generación de un PDF con IronPDF, consulte la páginasección how-to sobre la generación de PDF.
Cuando se trabaja con archivos PDF de gran tamaño, el uso de métodos asíncronos con `ConfigureAwait(falso)` puede mejorar significativamente el rendimiento liberando el hilo principal durante operaciones largas. Para este ejemplo, he tomado un documento PDF de gran tamaño y he realizado unaextracción de texto tarea de 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(falso)se utiliza *` durante la larga tarea de extraer todo el texto de un archivo PDF de gran tamaño, que en nuestro caso tenía más de 200 páginas.
Bloque try: He envuelto el código dentro del método LongPdfTask en un bloque try-catch para manejar con gracia cualquier excepción inesperada.
**PDF = await Task.Run(() => PdfDocument.FromFile("Ejemplo.pdf"))configureAwait(falso)esta línea puede dividirse en tres segmentos diferentes:
PDFDocument.FromFile("Ejemplo.pdf"): Esta sección carga de forma sincrónica el archivo PDF especificado en unIronPdf.PdfDocument objeto.
ConfigureAwait(falso) se utiliza mejor cuando se trabaja en código de biblioteca o procesamiento en segundo plano, donde no es necesario preservar el contexto de sincronización. Normalmente, se trata de código de servidor en el que el rendimiento es fundamental. Uso de ConfigureAwait(falso) significa que cuando se realiza la operación await, la continuación no se ejecuta necesariamente en el mismo hilo que inició la operación asíncrona.
Cuando se trata del procesamiento de PDF, la implementación de ConfigureAwait(falso) puede ayudar a maximizar el rendimiento cuando se ejecutan múltiples tareas de procesamiento de PDF para ayudar a 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(verdadero) se utiliza mejor en UI, en cualquier prueba unitaria para su código, o en aplicaciones ASP.NET donde la continuación debe ejecutarse en el mismo contexto, aunque si se utiliza mal puede llevar a un punto muerto. Por ejemplo, si estuviera actualizando la interfaz de usuario o accediendo a httpcontext). ConfigureAwait(verdadero) es el comportamiento por defecto, y también podría escribirse simplemente ConfigureAwait.
Cuando se utiliza con tareas de procesamiento de PDF, puede ser especialmente beneficioso en situaciones como si el código de procesamiento de PDF está estrechamente integrado con la interfaz de usuario(al utilizar aplicaciones de interfaz de usuario como WPF, WinForms, etc)para ello, es necesario capturar el contexto de sincronización para garantizar que estas actualizaciones se produzcan en el subproceso de la interfaz de usuario. 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 utilizar tareas de continuación con `ConfigureAwait(falso)\Las excepciones pueden ser manejadas usando try-catch dentro de la continuación, o por 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, puede generar archivos PDF a partir de varios tipos de archivos y datos, incluidos los siguientesArchivos HTML, Cadena HTML, URL, imágenes, DOCXyRTFa menudo en unas pocas líneas de código! Puede encargarse del formato de los documentos PDF, aplicarmarcas de agua personalizadas, fusionar y dividir PDF, manejarCodificación PDF yseguridady mucho 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 desea probar IronPDF por sí mismo y explorar su amplia gama de funciones, puede hacerlo fácilmente gracias a susprueba gratuita período. 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 los precios comienzan en 749 $ e incluyen una generosa garantía de devolución del dinero de 30 días, un año entero de soporte y actualizaciones del producto y una licencia perpetua(Sin molestas cuotas periódicas!)
Para generar un PDF de forma asíncrona, utilizaremos IronPDF para ejecutar el código de renderización del archivo HTML y guardar el resultado, mientras utilizamos ConfigureAwait(falso) para garantizar 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 async que creamos, static async Task
También hemos implementado la función await Task.Run()) => ...) método de nuevo para ejecutar las operaciones de forma asíncrona. Por último, hemos guardado el archivo PDF recién generado como "invoice.pdf" utilizando el método pdf.SaveAs. Todo el código dentro de *CreateInvoicePdfAsync()el método * 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 crear aplicaciones .NET eficaces y con capacidad de respuesta y para utilizarConfigureAwait correctamente puede ayudarle a conseguir un rendimiento óptimo, especialmente al escribir código a nivel de aplicación. Al trabajar conIronPDFaprovechando los métodos asíncronos junto con ConfigureAwait(falso) garantiza que las tareas de procesamiento de PDF no bloqueen el subproceso principal, lo que mejora la capacidad de respuesta general de la aplicación. Al comprender cuándo y cómo utilizar ConfigureAwait, puede hacer que sus tareas de procesamiento de PDF de IronPDF sean más sólidas y de mayor rendimiento.
Ahora puede avanzar como un profesional en la utilización de ConfigureAwait junto con IronPDF en la programación asíncrona, así que ¿a qué espera? Pruebe IronPDF hoy mismo para ver cómo puede mejorar sus proyectos relacionados con PDF! Si desea obtener más información sobre la amplia gama de funciones que IronPDF puede ofrecer como potente código de biblioteca de uso general, no deje de consultar su práctico manualguías prácticas. O, si desea obtener más información sobre el uso de IronPDF junto con métodos de programación asíncrona, o simplemente desea obtener más información sobre IronPDF en general, consulte nuestra página webentradas de blog. Si busca más ejemplos de generación asíncrona de PDF, consulte nuestra secciónC# Espere unos segundos o nuestro otro post sobreC# Task.Run.
9 productos API .NET para sus documentos de oficina