Saltar al pie de página
.NET AYUDA

C# Token de Cancelación (Cómo Funciona para Desarrolladores)

En el desarrollo de software moderno, gestionar tareas de larga duración de manera eficiente es crucial, especialmente en aplicaciones donde la generación de archivos PDF grandes o complejos es común. Los desarrolladores de C# a menudo confían en IronPDF para la creación de PDF sin problemas, pero manejar tareas de generación de PDF potencialmente largas requiere una forma de gestionar interrupciones o cancelaciones del usuario.

Aquí es donde entra en juego el CancellationToken en C#. Al integrarlo con IronPDF, puedes garantizar que tus tareas de generación de PDF sean tanto receptivas como eficientes. En este artículo, exploraremos la importancia de CancellationToken, por qué se complementa bien con IronPDF y cómo puedes implementarlo para cancelar tareas de manera elegante.

¿Qué es un CancellationToken en C#?

El CancellationToken es una parte fundamental de la programación asincrónica en C#. Te permite señalar que una tarea debería ser cancelada, dando a los desarrolladores un mayor control sobre operaciones de larga duración. Esto puede ser especialmente útil al realizar tareas como producir informes o facturas, donde es posible que desees generar continuamente informes dinámicos a partir de datos hasta alcanzar tu meta final, momento en el cual puedes usar tokens de cancelación de C# para indicar que la operación debe ser cancelada, lo que termina el programa de manera elegante.

¿Cómo funciona?

En esencia, un CancellationToken se pasa a una tarea o método, que periódicamente verifica si se ha solicitado cancelación. Si es así, la tarea puede terminar de manera elegante, liberando recursos y mejorando la capacidad de respuesta de tu aplicación. Esto es particularmente útil en casos como la generación de PDF, donde documentos complejos pueden tardar tiempo en crearse.

Al usar CancellationTokens, evitas los posibles inconvenientes de tareas que se ejecutan innecesariamente largas, como el desperdicio de recursos del sistema y una mala experiencia del usuario.

Fichas de cancelación interna

En C#, un token de cancelación interno se refiere a un token de cancelación que se crea y gestiona dentro de una clase o método específico, en lugar de ser pasado desde una fuente externa. Esto permite un control más fino sobre la cancelación de tareas dentro del alcance de un solo componente, permitiendo monitorear y responder a solicitudes de cancelación que se originan internamente.

Usar un token de cancelación interna es particularmente útil en escenarios donde deseas encapsular la lógica de cancelación sin exponerla a los consumidores de tu clase, manteniendo así una interfaz limpia. Este enfoque puede mejorar la modularidad del código y facilitar la gestión de flujos de trabajo asincrónicos complejos mientras sigue aprovechando la flexibilidad proporcionada por el marco CancellationToken más amplio.

¿Por qué utilizar un token de cancelación con IronPDF?

Al generar PDFs, especialmente en aplicaciones web o sistemas de informes complejos, puedes encontrar situaciones donde un usuario inicia una tarea, como crear un archivo PDF grande, pero luego navega fuera o ya no requiere el resultado. En estos casos, quieres la opción de cancelar el proceso de generación de PDF para evitar cargas innecesarias en el servidor o en la interfaz de usuario.

Aquí está el porqué usar CancellationToken con IronPDF es crucial:

1. Prevenir la carga innecesaria

Si un usuario ya no necesita el PDF que solicitó, no hay razón para que el proceso continúe. Al utilizar CancellationToken, puedes detener la tarea de generación de PDF, evitando una carga excesiva en tus servidores y mejorando el rendimiento general de la aplicación.

2. Mejorar la experiencia del usuario

En aplicaciones de escritorio, la generación de PDF podría ocurrir en el hilo de la interfaz de usuario, lo que podría bloquear la interfaz de usuario si la tarea es de larga duración. Al incorporar CancellationToken, los usuarios pueden cancelar la tarea y mantener la aplicación receptiva.

3. Mejorar la escalabilidad

En aplicaciones web donde numerosos usuarios generan PDFs simultáneamente, la escalabilidad es clave. CancellationToken te permite cancelar de manera segura tareas innecesarias, liberando recursos para manejar otras solicitudes de manera eficiente.

Cómo implementar CancellationToken con IronPDF

Ahora que entendemos por qué CancellationToken es útil, veamos cómo implementarlo con IronPDF.

Paso 1: Configurar IronPDF en su proyecto

Para comenzar a usar IronPDF, primero deberá instalarlo. Si ya está instalado, puede pasar a la siguiente sección; de lo contrario, los siguientes pasos cubren cómo instalar la biblioteca IronPDF.

Vía la Consola del Administrador de Paquetes NuGet

Para instalar IronPDF utilizando la Consola del Administrador de Paquetes NuGet, abra Visual Studio y navegue a la Consola del Administrador de Paquetes. Luego ejecute el siguiente comando:

Install-Package IronPdf

Vía el Administrador de Paquetes NuGet para Solución

Abriendo Visual Studio, ve a "Herramientas -> Administrador de Paquetes NuGet -> Administrar Paquetes NuGet para Solución" y busca IronPDF. Desde aquí, todo lo que necesitas hacer es seleccionar tu proyecto y hacer clic en "Instalar", y IronPDF se añadirá a tu proyecto.

Una vez que haya instalado IronPDF, todo lo que necesita agregar para comenzar a usar IronPDF es la declaración correcta de using en la parte superior de su código:

using IronPdf;
using IronPdf;
$vbLabelText   $csharpLabel

Paso 2: Uso de tokens de cancelación en un método asíncrono de generación de PDF

Veamos la implementación real. En este ejemplo, generaremos un PDF simple desde HTML usando IronPDF, pero con un CancellationToken que permite cancelar la tarea si es necesario.

using IronPdf;
using System;
using System.Threading;
using System.Threading.Tasks;

public class PdfGenerator
{
    public async Task GeneratePdfWithCancellation(CancellationToken token)
    {
        var Renderer = new ChromePdfRenderer();
        try
        {
            // Check for cancellation before starting
            token.ThrowIfCancellationRequested();

            // Simulating a long task that can be checked for cancellation periodically
            for (int i = 0; i < 10; i++)
            {
                // Simulating a piece of work (this could be part of a larger HTML rendering)
                await Task.Delay(500); // Simulate chunk processing

                // Periodically check for cancellation in long-running operations
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("Cancellation requested. Throwing exception.");
                    token.ThrowIfCancellationRequested();  // This will trigger an OperationCanceledException
                }
            }

            // Simulate PDF creation after the long process
            var pdf = await Renderer.RenderHtmlAsPdfAsync("<h1>Hello, PDF!</h1>");

            // Save the PDF after ensuring no cancellation occurred
            pdf.SaveAs("output.pdf");
            Console.WriteLine("PDF generated successfully.");
        }
        catch (OperationCanceledException)
        {
            // Handle task cancellation
            Console.WriteLine("PDF generation was canceled.");
        }
        catch (Exception ex)
        {
            // Handle other exceptions
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

public class Program
{
    public static async Task Main(string[] args)
    {
        // Create a CancellationTokenSource
        var cancellationTokenSource = new CancellationTokenSource();

        // Create our cancellation token
        var token = cancellationTokenSource.Token;

        // Start the PDF generation task
        var pdfGenerator = new PdfGenerator();
        Task pdfTask = pdfGenerator.GeneratePdfWithCancellation(token);

        // Simulate a cancellation scenario
        Console.WriteLine("Press any key to cancel PDF generation...");
        Console.ReadKey();

        // Cancel the task by calling Cancel() on the CancellationTokenSource
        cancellationTokenSource.Cancel();

        try
        {
            // Await the task to handle any exceptions, such as cancellation
            await pdfTask;
        }
        catch (OperationCanceledException)
        {
            // Confirm the cancellation
            Console.WriteLine("The PDF generation was canceled.");
        }
        finally
        {
            cancellationTokenSource.Dispose();
        }

        Console.WriteLine("Program finished.");
    }
}
using IronPdf;
using System;
using System.Threading;
using System.Threading.Tasks;

public class PdfGenerator
{
    public async Task GeneratePdfWithCancellation(CancellationToken token)
    {
        var Renderer = new ChromePdfRenderer();
        try
        {
            // Check for cancellation before starting
            token.ThrowIfCancellationRequested();

            // Simulating a long task that can be checked for cancellation periodically
            for (int i = 0; i < 10; i++)
            {
                // Simulating a piece of work (this could be part of a larger HTML rendering)
                await Task.Delay(500); // Simulate chunk processing

                // Periodically check for cancellation in long-running operations
                if (token.IsCancellationRequested)
                {
                    Console.WriteLine("Cancellation requested. Throwing exception.");
                    token.ThrowIfCancellationRequested();  // This will trigger an OperationCanceledException
                }
            }

            // Simulate PDF creation after the long process
            var pdf = await Renderer.RenderHtmlAsPdfAsync("<h1>Hello, PDF!</h1>");

            // Save the PDF after ensuring no cancellation occurred
            pdf.SaveAs("output.pdf");
            Console.WriteLine("PDF generated successfully.");
        }
        catch (OperationCanceledException)
        {
            // Handle task cancellation
            Console.WriteLine("PDF generation was canceled.");
        }
        catch (Exception ex)
        {
            // Handle other exceptions
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

public class Program
{
    public static async Task Main(string[] args)
    {
        // Create a CancellationTokenSource
        var cancellationTokenSource = new CancellationTokenSource();

        // Create our cancellation token
        var token = cancellationTokenSource.Token;

        // Start the PDF generation task
        var pdfGenerator = new PdfGenerator();
        Task pdfTask = pdfGenerator.GeneratePdfWithCancellation(token);

        // Simulate a cancellation scenario
        Console.WriteLine("Press any key to cancel PDF generation...");
        Console.ReadKey();

        // Cancel the task by calling Cancel() on the CancellationTokenSource
        cancellationTokenSource.Cancel();

        try
        {
            // Await the task to handle any exceptions, such as cancellation
            await pdfTask;
        }
        catch (OperationCanceledException)
        {
            // Confirm the cancellation
            Console.WriteLine("The PDF generation was canceled.");
        }
        finally
        {
            cancellationTokenSource.Dispose();
        }

        Console.WriteLine("Program finished.");
    }
}
$vbLabelText   $csharpLabel

Salida de Consola

C# Cancellationtoken (Cómo Funciona Para Desarrolladores): Figura 2 - Salida de Consola

Salida de PDF

C# Cancellationtoken (Cómo Funciona Para Desarrolladores): Figura 3 - Salida de PDF

En este ejemplo, demostramos cómo usar un CancellationToken en un programa de C# para cancelar una tarea de generación de PDF de larga duración con IronPDF. El código está estructurado en dos partes: el proceso de generación de PDF (clase PdfGenerator) y la lógica principal del programa (clase Program).

  • Clase PdfGenerator: Esta clase contiene un método que simula la generación de un archivo PDF mientras soporta cancelación a través de un CancellationToken.
  • Creamos nuestra fuente de token de cancelación en el método main usando CancellationTokenSource(), y luego creamos nuestro objeto de token pasando la propiedad Token del CancellationTokenSource a él.
  • ChromePdfRenderer se usa de la biblioteca IronPDF para renderizar contenido HTML en un documento PDF.
  • El método GeneratePdfWithCancellation es asincrónico (async) y devuelve una Tarea. Este método acepta un CancellationToken (token) para manejar la cancelación de tareas mediante la solicitud de cancelación.
  • El CancellationToken nos permite cancelar de manera segura operaciones de larga duración. Sin embargo, la cancelación es cooperativa, lo que significa que la propia tarea debe verificar periódicamente el estado del token.
  • En este código, simulamos una tarea larga con verificaciones periódicas de cancelación. El punto clave es que verificamos manualmente la cancelación (token.IsCancellationRequested) durante el proceso de generación de PDF, listos para ejecutar el método de cancelar si el token se pasa a él.
  • Si el usuario presiona una tecla para señalar la cancelación del programa, la tarea se detiene de manera elegante y lanza una OperationCanceledException, impidiendo la finalización de la generación de PDF de manera apropiada y oportuna.
  • El PDF resultante se guarda como "output.pdf" si no se produjo cancelación para evitar que el programa ejecute el proceso de tarea completo.

Casos de uso reales de IronPDF con CancellationToken

Hay varias situaciones prácticas donde usar uno o varios tokens de cancelación con IronPDF puede mejorar el rendimiento y la experiencia del usuario de tu aplicación. Aquí hay algunos ejemplos:

1. Aplicaciones web

En una aplicación web, los usuarios a menudo inician acciones como generar informes en formato PDF. Sin embargo, si el usuario navega fuera de la página o cierra el navegador, el sistema puede detectar esto y usar CancellationToken para detener el proceso de generación de PDF.

HttpContext.Response.RegisterForDispose(CancellationTokenSource);
HttpContext.Response.RegisterForDispose(CancellationTokenSource);
$vbLabelText   $csharpLabel

Esta implementación simple permite a los servidores web escalar más eficazmente al no dedicar recursos a tareas que ya no son necesarias.

2. Informes de larga duración

En aplicaciones de informes, los usuarios pueden solicitar conjuntos de datos grandes para ser exportados como PDFs. Si el usuario cambia de opinión o realiza una consulta incorrecta, CancellationToken te permite cancelar la tarea a mitad de camino, previniendo el desperdicio de recursos.

3. Servicios de fondo

En servicios de fondo o microservicios, las tareas que toman una cantidad significativa de tiempo, como generar grandes lotes de PDF, pueden gestionarse de manera más eficiente usando CancellationToken. Cuando el servicio está a punto de cerrarse o reducirse, se pueden cancelar las tareas en progreso de manera limpia, asegurando que no se pierdan ni se corrompan datos.

Conclusión

Ahora que hemos llegado al final de la discusión de hoy sobre el uso de tokens de cancelación con IronPDF, serás capaz de implementarlos en tus proyectos de PDF como un profesional. Usar C# CancellationToken con IronPDF te permite construir aplicaciones más eficientes y receptivas que manejan tareas de generación de PDF de manera elegante. Este enfoque permite un modelo de cancelación cooperativa, permitiendo que las tareas verifiquen las solicitudes de cancelación en puntos seguros durante la ejecución, en lugar de ser terminadas abruptamente.

Ya sea que estés gestionando informes de larga duración, generación de PDF bajo demanda en aplicaciones web o servicios de fondo, incorporar un CancellationToken, o múltiples tokens simultáneamente, asegura que las tareas innecesarias puedan ser canceladas, previniendo el desperdicio de recursos y mejorando la experiencia del usuario.

Con solo unas pocas líneas de código, puedes mejorar la escalabilidad y la capacidad de respuesta de tu aplicación mientras das a los usuarios más control sobre sus acciones. Si aún no has explorado IronPDF, ahora es el momento perfecto para probar la prueba gratuita y descubrir cómo sus potentes capacidades de generación de PDF pueden transformar tus proyectos en C#.

Preguntas Frecuentes

¿Cómo puedo usar un CancellationToken para gestionar tareas de larga duración en C#?

Puedes integrar un CancellationToken en tus tareas de larga duración pasándolo a la tarea y verificando periódicamente si se ha solicitado una cancelación. Esto permite la terminación suave de tareas, liberando recursos y manteniendo la capacidad de respuesta de la aplicación.

¿Por qué es importante un CancellationToken en la generación de PDF?

En la generación de PDFs, un CancellationToken ayuda a gestionar los recursos de manera eficiente, permitiendo que las tareas se cancelen si se vuelven innecesarias, como cuando un usuario navega fuera de una página. Esto previene la carga excesiva del servidor y mejora la experiencia del usuario.

¿Cómo implemento un CancellationToken en una tarea de generación de PDF en C#?

Para implementar un CancellationToken en una tarea de generación de PDF en C#, pasas el token a tu método y verificas las solicitudes de cancelación a intervalos regulares durante la ejecución. Si se detecta una cancelación, puedes terminar la tarea de manera controlada.

¿Cuál es el propósito de usar métodos async con CancellationToken en la generación de PDFs?

El uso de métodos async con un CancellationToken en la generación de PDFs permite que las tareas se ejecuten de manera asincrónica, mejorando la capacidad de respuesta de la aplicación y permitiendo que las tareas sean canceladas si ya no son necesarias.

¿Cómo mejora un CancellationToken la experiencia del usuario en aplicaciones web?

Al utilizar un CancellationToken, las aplicaciones web pueden cancelar tareas como la generación de PDFs cuando un usuario navega fuera, evitando el procesamiento innecesario y manteniendo la aplicación receptiva, lo que mejora la experiencia del usuario.

¿Cuál es el papel de ChromePdfRenderer en la creación asincrónica de PDFs?

ChromePdfRenderer de IronPDF se utiliza para convertir contenido HTML en un documento PDF. Soporta operaciones asincrónicas, permitiendo el uso de un CancellationToken para gestionar el ciclo de vida de las tareas y la capacidad de respuesta de manera efectiva.

¿Qué puede suceder si se realiza una solicitud de cancelación durante la generación de PDFs?

Si se realiza una solicitud de cancelación durante la generación de PDFs, la tarea verificará el estado del CancellationToken. Si se detecta cancelación, lanzará una OperationCanceledException, deteniendo el proceso para conservar recursos.

¿Cómo mejora el CancellationToken la escalabilidad de las aplicaciones?

El CancellationToken mejora la escalabilidad permitiendo que las aplicaciones cancelen tareas innecesarias, como al generar PDFs, lo cual reduce el consumo de recursos y mejora el rendimiento general de la aplicación.

¿Cuáles son los beneficios de usar CancellationToken en servicios en segundo plano?

En servicios en segundo plano, el uso de un CancellationToken permite gestionar tareas de larga duración, como el procesamiento por lotes de PDFs, al permitir que las tareas sean canceladas limpiamente durante el apagado del servicio o al escalar operaciones.

¿Cómo mejora la eficiencia de la aplicación la integración de CancellationToken con IronPDF?

Integrar CancellationToken con IronPDF permite una mejor gestión de recursos al cancelar tareas innecesarias de generación de PDFs, lo que mejora la eficiencia y capacidad de respuesta de la aplicación mientras se reduce la carga del servidor.

Jacob Mellor, Director de Tecnología @ Team Iron
Director de Tecnología

Jacob Mellor es Director de Tecnología en Iron Software y un ingeniero visionario que lidera la tecnología PDF en C#. Como el desarrollador original detrás de la base de código central de Iron Software, ha moldeado la arquitectura de productos de la compañía desde ...

Leer más