AYUDA .NET

C# Task.Run (Cómo Funciona Para Desarrolladores)

Actualizado agosto 13, 2024
Compartir:

Introducción

En este artículo nos adentramos en los fundamentos del Task.Run en C#, un potente constructo de la programación asíncrona. La programación asíncrona es esencial para escribir aplicaciones eficaces y con capacidad de respuesta, especialmente cuando se trata de operaciones que pueden bloquear la ejecución de la aplicación, como las llamadas de red o las tareas de cálculo intensivas. Task.Run es uno de los métodos asíncronos más utilizados para descargar estas operaciones a un hilo en segundo plano, mejorando el rendimiento y la capacidad de respuesta de las aplicaciones. Exploraremos el método Task.Run y el método Biblioteca IronPDF con él.

Entender Task.Run

Task.Run es un método de llamada proporcionado por .NET Core que permite a los desarrolladores ejecutar código ligado a la CPU u operaciones ligadas a la E/S de forma asíncrona en un subproceso separado del grupo de subprocesos. Este método es beneficioso para mantener la capacidad de respuesta de su subproceso de interfaz de usuario mediante el uso de un subproceso asíncrono para realizar operaciones de larga duración. Simplifica el inicio de una nueva operación asíncrona en un hilo diferente, que luego se puede esperar utilizando la palabra clave await.

Uso básico de Task.Run

Considere un ejemplo sencillo en el que tenga que realizar un cálculo largo. En lugar de ejecutar esto directamente en el hilo principal, lo que bloquearía la interfaz de usuario, puede utilizar Task.Run para manejarlo en segundo plano:

static async Task PerformComputation() 
{
    int result = await Task.Run(() =>
    {
        int sum = 0;
        for (int i = 0; i < 1000000; i++)
        {
            sum += i;
        }
        return sum;
    });
    Console.WriteLine($"The result is {result}");
}
static async Task PerformComputation() 
{
    int result = await Task.Run(() =>
    {
        int sum = 0;
        for (int i = 0; i < 1000000; i++)
        {
            sum += i;
        }
        return sum;
    });
    Console.WriteLine($"The result is {result}");
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

Salida

C# Tarea.Ejecutar (Cómo funciona para desarrolladores): Figura 1 - Salida de la consola del código anterior

En el ejemplo anterior, la expresión lambda dentro de Task.Run representa un bloque de código limitado a la CPU que suma un gran rango de números. Al utilizar Task.Run, este cálculo se descarga a un subproceso en segundo plano, permitiendo que el subproceso principal siga respondiendo. La palabra clave de la tarea await se utiliza para esperar de forma asíncrona hasta que la tarea se complete, sin bloquear el subproceso actual.

Profundizar en las tareas e hilos asíncronos

Cuando se invoca Task.Run, .NET Framework asigna un subproceso del grupo de subprocesos para ejecutar la tarea especificada. Esto es eficiente, ya que evita la sobrecarga de crear nuevos hilos para cada tarea y ayuda a utilizar los recursos del sistema de manera más eficaz. El grupo de hilos gestiona un conjunto de hilos de trabajo para su aplicación, que puede ejecutar varias tareas simultáneamente en varios núcleos.

Gestión de múltiples tareas

Puede ejecutar una nueva tarea de forma concurrente utilizando Task.Run, lo cual es beneficioso para aplicaciones que necesitan realizar varias operaciones independientes simultáneamente. A continuación te explicamos cómo puedes iniciar varias tareas:

static async Task HandleMultipleTasks()
{
    Task<int> task1 = Task.Run(() =>
    {
        return PerformLongRunningWork("Task 1");
    });
    Task<int> task2 = Task.Run(() =>
    {
        return PerformLongRunningWork("Task 2");
    });
    // Wait for tasks to finish and print the results
    int[] results = await Task.WhenAll(task1, task2); 
    Console.WriteLine($"Results of Task 1: {results[0]}, Task 2: {results[1]}");
}
static int PerformLongRunningWork(string taskName)
{
    int result = 0;
    for (int i = 0; i < 500000; i++)
    {
        result += i;
    }
    Console.WriteLine($"{taskName} completed.");
    return result;
}
static async Task HandleMultipleTasks()
{
    Task<int> task1 = Task.Run(() =>
    {
        return PerformLongRunningWork("Task 1");
    });
    Task<int> task2 = Task.Run(() =>
    {
        return PerformLongRunningWork("Task 2");
    });
    // Wait for tasks to finish and print the results
    int[] results = await Task.WhenAll(task1, task2); 
    Console.WriteLine($"Results of Task 1: {results[0]}, Task 2: {results[1]}");
}
static int PerformLongRunningWork(string taskName)
{
    int result = 0;
    for (int i = 0; i < 500000; i++)
    {
        result += i;
    }
    Console.WriteLine($"{taskName} completed.");
    return result;
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

Salida

C# Tarea.Ejecutar (Cómo funciona para desarrolladores): Figura 2

En este ejemplo, HandleMultipleTasks inicia dos tareas asíncronas. El método Task.WhenAll se utiliza para esperar cada tarea asíncrona, lo que les permite ejecutarse concurrentemente. Una vez completadas ambas tareas, continúa con la siguiente línea de código.

Buenas prácticas y consideraciones

Aunque Task.Run es una herramienta valiosa para la programación asíncrona, es importante utilizarla con prudencia para evitar errores comunes como el uso excesivo de recursos del sistema o provocar comportamientos inesperados en tu aplicación.

Utilizar Task.Run para operaciones limitadas a la CPU

Es mejor utilizar Task.Run para trabajos ligados a la CPU y no para operaciones ligadas a la E/S. Para tareas de E/S, utilice las operaciones de E/S asíncronas disponibles en las bibliotecas .NET.

Cuidado con los hilos de rosca

Recuerda que Task.Run utiliza hilos de thread pool. Agotar estos hilos ejecutando demasiadas operaciones simultáneas puede provocar retrasos en los tiempos de inicio de las tareas y ralentización general de la aplicación.

Evite el código síncrono

Cuando esperes tareas iniciadas por Task.Run, evita usar esperas síncronas como los métodos Task.Result o Task.Wait, ya que pueden llevar a bloqueos, especialmente en contextos como aplicaciones UI.

IronPDF Introducción

C# Tarea.Ejecutar (Cómo funciona para los desarrolladores): Figura 3 - Página web de IronPDF

IronPDF es una biblioteca de C# que le permite generar y gestionar Archivos PDF directamente desde HTMLcSS y JavaScript. Está diseñado para desarrolladores .NET y simplifica la creación de PDF utilizando el contenido web que ya tiene, garantizando que lo que ve en el navegador es lo que obtendrá en el PDF. Es adecuado para diversas aplicaciones .NET, ya sean web, de escritorio o basadas en servidor, y ofrece funciones como edición de PDF, gestión de formularios y creación segura de documentos.

En términos más sencillos, IronPDF le ayuda a convertir páginas web en PDF con facilidad y precisión. No necesita complicarse con API complejas; sólo tiene que diseñar su página en HTML y IronPDF se encarga del resto. Funciona en diferentes plataformas .NET y ofrece herramientas para ajustar, asegurar e interactuar con sus PDF.

IronPDF con Task.Run

Ejemplo de código

He aquí un sencillo ejemplo de uso de IronPDF con Task.Run en C#. Este ejemplo muestra cómo generar un PDF a partir de contenido HTML de forma asíncrona. Esto resulta especialmente útil para evitar la congelación de la interfaz de usuario en aplicaciones de escritorio o para gestionar la carga en aplicaciones web:

using IronPdf;
using System.Threading.Tasks;
public class PdfGenerator
{
    public static async Task CreatePdfAsync()
    {
        var renderer = new ChromePdfRenderer();
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is an async PDF generation.</p>";
        // Run the PDF generation in a separate task
        var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf(htmlContent));
        // Save the PDF to a file
        pdf.SaveAs("asyncIronPDF.pdf");
    }
    // Usage
    public static void Main()
    {
        License.LicenseKey = "License-Key";
        Task.Run(async () => await PdfGenerator.CreatePdfAsync()).Wait();
        System.Console.WriteLine("PDF generated.");
    }
}
using IronPdf;
using System.Threading.Tasks;
public class PdfGenerator
{
    public static async Task CreatePdfAsync()
    {
        var renderer = new ChromePdfRenderer();
        var htmlContent = "<h1>Hello, IronPDF!</h1><p>This is an async PDF generation.</p>";
        // Run the PDF generation in a separate task
        var pdf = await Task.Run(() => renderer.RenderHtmlAsPdf(htmlContent));
        // Save the PDF to a file
        pdf.SaveAs("asyncIronPDF.pdf");
    }
    // Usage
    public static void Main()
    {
        License.LicenseKey = "License-Key";
        Task.Run(async () => await PdfGenerator.CreatePdfAsync()).Wait();
        System.Console.WriteLine("PDF generated.");
    }
}
IRON VB CONVERTER ERROR developers@ironsoftware.com
VB   C#

Salida

C# Tarea.Ejecutar (Cómo funciona para desarrolladores): Figura 4 - PDF resultante del ejemplo de código IronPDF y Task.Run

Este ejemplo encapsula la generación de PDF dentro de una tarea, por lo que es adecuado para aplicaciones que requieren operaciones no bloqueantes.

Conclusión

C# Tarea.Ejecutar (Cómo funciona para los desarrolladores): Figura 5 - Página de licencias de IronPDF

Task.Run es una potente función de C# para gestionar tareas asíncronas de forma eficaz. Si sabe cómo utilizarlo correctamente, podrá mejorar el rendimiento y la capacidad de respuesta de sus aplicaciones. Recuerda tener en cuenta si una tarea está ligada a la CPU o a la E/S a la hora de decidir cómo implementar operaciones asíncronas, y procura mantener siempre el subproceso de interfaz de usuario libre de tareas pesadas de procesamiento.

Los desarrolladores pueden probar IronPDF utilizando su herramienta**Prueba gratuita antes de decidirse a comprar. El precio inicial de una licencia es de 749 dólares.

< ANTERIOR
C# Volátil (Cómo funciona para los desarrolladores)
SIGUIENTE >
C# Nito.Asyncex (Cómo funciona para desarrolladores)

¿Listo para empezar? Versión: 2024.9 acaba de salir

Descarga gratuita de NuGet Descargas totales: 10,516,730 View Licenses >