AYUDA .NET

C# ConfigureAwait (Cómo funciona para desarrolladores)

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.

Comprender la programación asíncrona en C#;

¿Qué es la programación asíncrona?

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.

El papel de ConfigureAwait en el código asíncrono

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.

Cómo utilizar ConfigureAwait con IronPDF

Configuración de IronPDF en su proyecto .NET

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:

C# ConfigureAwait (Cómo Funciona para Desarrolladores): Figura 1

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
$vbLabelText   $csharpLabel

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.

Generación asíncrona de archivos PDF con IronPDF

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
$vbLabelText   $csharpLabel

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.

Trabajar con archivos PDF de gran tamaño de forma asíncrona

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
$vbLabelText   $csharpLabel

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.

  • Importaciones y Configuración: La primera sección en la parte superior de nuestro código se dedica a importar las bibliotecas y espacios de nombres necesarios. Debe asegurarse de tener `using IronPdf` para usar la biblioteca IronPDF
  • Clase y Método Principal: `class Program` define la clase que contiene el código principal de la aplicación para este proyecto. `static async Task Main(string[] args)` es el punto de entrada para la aplicación. Aquí, lo hemos marcado como async para que nuestras operaciones asincrónicas puedan ejecutarse desde su interior. Luego, utilizamos await LongPdfTask() para llamar al método LongPdfTask de forma asincrónica.
  • 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.

      • await Task.Run(() => ...): Ejecuta la operación de carga de PDF en un hilo separado para evitar bloquear el hilo principal. Esto hace que sea una operación asíncrona.
  • .ConfigureAwait(false): Evita capturar el contexto actual, lo que debería mejorar el rendimiento y reducir los bloqueos.
  • string text = await Task.Run(() => pdf.ExtractAllText()).ConfigureAwait(false): Esto ejecuta el método de extracción de texto de IronPDF, ExtractAllText(). Nuevamente, await Task.Run(() => ...) se utiliza para ejecutar esta operación de forma asíncrona en un hilo separado.
  • await Task.Run(() => File.WriteAllText("extractedText.txt", text)).ConfigureAwait(false): Con esto, estamos escribiendo el texto extraído a un archivo .txt de forma asincrónica utilizando el método await Task una vez más.

Antes de

C# ConfigureAwait (Cómo Funciona Para Desarrolladores): Figura 2

Salida

C# ConfigureAwait (Cómo funciona para desarrolladores): Figura 3

Prácticas recomendadas para el uso de ConfigureAwait en aplicaciones .NET

Cuándo utilizar ConfigureAwait(true) frente a ConfigureAwait(false)

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.

Manejo de excepciones en operaciones IronPDF asíncronas

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
$vbLabelText   $csharpLabel

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
$vbLabelText   $csharpLabel

¿Por qué elegir IronPDF para sus necesidades de procesamiento de PDF?

Principales características y ventajas de IronPDF

C# ConfigureAwait (Cómo Funciona Para Desarrolladores): Figura 4

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.

Compatibilidad de IronPDF con la programación asíncrona

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.

Licencias

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!)

C# ConfigureAwait (Cómo Funciona Para Desarrolladores): Figura 5

Ejemplo: Uso de ConfigureAwait e IronPDF para la generación de PDF

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
$vbLabelText   $csharpLabel

En este ejemplo, estamos utilizando el método asíncrono que creamos, static async TaskCreateInvoicePdfAsync(), para generar una factura PDF a partir del archivo HTML proporcionado por el método RenderHtmlFileAsPdfAsync. Hemos utilizado ConfigureAwait(false) para evitar la continuación de esta tarea en el contexto de sincronización original, mejorando así el rendimiento de nuestra aplicación no UI.

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.

Archivo HTML

C# ConfigureAwait (Cómo Funciona Para Desarrolladores): Figura 6

Salida

C# ConfigureAwait (Cómo funciona para desarrolladores): Figura 7

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.

Conclusión

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.

Chipego
Ingeniero de software
Chipego tiene una habilidad natural para escuchar que le ayuda a comprender los problemas de los clientes y a ofrecer soluciones inteligentes. Se unió al equipo de Iron Software en 2023, después de estudiar una licenciatura en Tecnología de la Información. IronPDF e IronOCR son los dos productos en los que Chipego se ha centrado, pero su conocimiento de todos los productos crece día a día, a medida que encuentra nuevas formas de ayudar a los clientes. Disfruta de lo colaborativa que es la vida en Iron Software, con miembros del equipo de toda la empresa que aportan su variada experiencia para contribuir a soluciones eficaces e innovadoras. Cuando Chipego está lejos de su escritorio, a menudo se le puede encontrar disfrutando de un buen libro o jugando al fútbol.
< ANTERIOR
Azure Tables (Cómo funciona para desarrolladores)
SIGUIENTE >
Tipos nulos en C# (Cómo funciona para desarrolladores)