.NET-HILFE

C# Task.Run (So funktioniert es für Entwickler)

Veröffentlicht 13. August 2024
Teilen Sie:

Einführung

In diesem Artikel befassen wir uns mit den Grundlagen der Task.Run in C#, ein leistungsfähiges Konstrukt der asynchronen Programmierung. Asynchrone Programmierung ist für das Schreiben von reaktionsschnellen und effizienten Anwendungen unverzichtbar, insbesondere wenn es um Vorgänge geht, die die Ausführung Ihrer Anwendung blockieren können, wie Netzwerkaufrufe oder rechenintensive Aufgaben. Task.Run ist eine der am häufigsten verwendeten asynchronen Methoden, um diese Vorgänge in einen Hintergrund-Thread zu verlagern und so die Leistung und Reaktionsfähigkeit von Anwendungen zu verbessern. Wir werden die Methode Task.Run und die IronPDF-Bibliothek mit ihm.

Verstehen von Task.Run

Task.Run ist eine von .NET Core bereitgestellte Aufrufmethode, die es Entwicklern ermöglicht, CPU-gebundenen Code oder E/A-gebundene Operationen asynchron auf einem separaten Thread des Threadpools auszuführen. Diese Methode ist vorteilhaft, um den UI-Thread reaktionsschnell zu halten, indem ein asynchroner Thread für die Durchführung lang laufender Operationen verwendet wird. Es vereinfacht das Starten einer neuen asynchronen Operation auf einem anderen Thread, die dann mit dem Schlüsselwort await abgewartet werden kann.

Grundlegende Verwendung von Task.Run

Betrachten Sie ein einfaches Beispiel, bei dem Sie eine langwierige Berechnung durchführen müssen. Anstatt dies direkt auf dem Hauptthread auszuführen, was die Benutzeroberfläche blockieren würde, können Sie Task.Run verwenden, um es im Hintergrund zu erledigen:

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#

Ausgabe

C# Aufgabe.Ausführen (So funktioniert es für Entwickler): Abbildung 1 - Konsolenausgabe des vorherigen Codes

Im obigen Beispiel stellt der Lambda-Ausdruck innerhalb von Task.Run einen Block von CPU-gebundenem Code dar, der einen großen Zahlenbereich summiert. Durch die Verwendung von Task.Run wird diese Berechnung auf einen Hintergrund-Thread verlagert, so dass der Haupt-Thread reaktionsfähig bleibt. Das Aufgabenschlüsselwort await wird verwendet, um asynchron zu warten, bis die Aufgabe abgeschlossen ist, ohne den aktuellen Thread zu blockieren.

Tieferes Verständnis von asynchronen Tasks und Threads

Wenn Sie Task.Run aufrufen, weist das .NET-Framework einen Thread aus dem Threadpool zu, um die angegebene Aufgabe auszuführen. Dies ist effizient, da es den Overhead vermeidet, der durch die Erstellung neuer Threads für jede Aufgabe entsteht, und hilft, die Systemressourcen effektiver zu nutzen. Der Thread-Pool verwaltet eine Reihe von Worker-Threads für Ihre Anwendung, die mehrere Aufgaben gleichzeitig auf mehreren Kernen ausführen können.

Handhabung mehrerer Aufgaben

Mit Task.Run können Sie eine neue Aufgabe gleichzeitig ausführen, was für Anwendungen von Vorteil ist, die mehrere unabhängige Vorgänge gleichzeitig ausführen müssen. Hier erfahren Sie, wie Sie mehrere Aufgaben starten können:

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#

Ausgabe

C# Aufgabe.Ausführen (Wie es für Entwickler funktioniert): Abbildung 2

In diesem Beispiel werden mit HandleMultipleTasks zwei asynchrone Aufgaben gestartet. Die Methode Task.WhenAll wird verwendet, um jede asynchrone Aufgabe abzuwarten, so dass sie gleichzeitig ausgeführt werden können. Sobald beide Aufgaben abgeschlossen sind, wird mit der nächsten Codezeile fortgefahren.

Bewährte Praktiken und Überlegungen

Obwohl Task.Run ein wertvolles Werkzeug für die asynchrone Programmierung ist, ist es wichtig, es mit Bedacht einzusetzen, um häufige Fallstricke zu vermeiden, wie z. B. die übermäßige Nutzung von Systemressourcen oder unerwartetes Verhalten in Ihrer Anwendung.

Task.Run für CPU-gebundene Operationen verwenden

Es ist am besten, Task.Run für CPU-gebundene Arbeit und nicht für E/A-gebundene Operationen zu verwenden. Verwenden Sie für E/A-gebundene Aufgaben die in .NET-Bibliotheken verfügbaren asynchronen E/A-Operationen.

Seien Sie vorsichtig mit Thread-Pool-Threads

Denken Sie daran, dass Task.Run Thread-Pool-Threads verwendet. Wenn diese Threads durch zu viele gleichzeitige Vorgänge erschöpft werden, kann dies zu Verzögerungen beim Start von Aufgaben und zu einer allgemeinen Verlangsamung der Anwendung führen.

Vermeiden Sie synchronen Code

Wenn Sie auf Aufgaben warten, die durch Task.Run gestartet wurden, vermeiden Sie synchrone Wartezeiten wie Task.Result oder Task.Wait Methoden, da diese zu Deadlocks führen können, insbesondere in Kontexten wie UI-Anwendungen.

IronPDF Einführung

C# Aufgabe.Ausführen (Wie es für Entwickler funktioniert): Abbildung 3 - IronPDF-Webseite

IronPDF ist eine C#-Bibliothek, mit der Sie die folgenden Daten erzeugen und verwalten können PDF-Dateien direkt aus HTML, CSS und JavaScript. Es wurde für .NET-Entwickler entwickelt und vereinfacht die PDF-Erstellung, indem es bereits vorhandene Web-Inhalte verwendet und sicherstellt, dass das, was Sie im Browser sehen, auch in der PDF-Datei enthalten ist. Es eignet sich für verschiedene .NET-Anwendungen, egal ob sie web-, desktop- oder serverbasiert sind, und bietet Funktionen wie PDF-Bearbeitung, Formularverarbeitung und sichere Dokumentenerstellung.

Einfacher ausgedrückt: IronPDF hilft Ihnen, Webseiten einfach und präzise in PDFs umzuwandeln. Sie müssen sich nicht mit komplexen APIs herumschlagen; entwerfen Sie einfach Ihre Seite in HTML und IronPDF erledigt den Rest. Es funktioniert auf verschiedenen .NET-Plattformen und bietet Werkzeuge zur Anpassung, Sicherung und Interaktion mit Ihren PDFs.

IronPDF mit Task.Run

Code-Beispiel

Hier ist ein einfaches Beispiel für die Verwendung von IronPDF mit Task.Run in C#. Dieses Beispiel zeigt, wie man aus HTML-Inhalten asynchron eine PDF-Datei erzeugt. Dies ist besonders nützlich, um das Einfrieren der Benutzeroberfläche in Desktop-Anwendungen zu vermeiden oder die Last in Web-Anwendungen zu verwalten:

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#

Ausgabe

C# Aufgabe.Ausführen (Wie es für Entwickler funktioniert): Abbildung 4 - Ausgegebene PDF-Datei aus dem IronPDF- und Task.Run-Codebeispiel

In diesem Beispiel ist die PDF-Erzeugung in einer Task gekapselt, so dass sie sich für Anwendungen eignet, die nicht blockierende Operationen erfordern.

Schlussfolgerung

C# Aufgabe.Ausführen (So funktioniert es für Entwickler): Abbildung 5 - IronPDF-Lizenzierungsseite

Task.Run ist eine leistungsstarke Funktion in C# zur effektiven Verwaltung asynchroner Aufgaben. Wenn Sie wissen, wie man sie richtig einsetzt, können Sie die Leistung und Reaktionsfähigkeit Ihrer Anwendungen verbessern. Denken Sie daran, ob eine Aufgabe CPU- oder E/A-gebunden ist, wenn Sie entscheiden, wie Sie asynchrone Operationen implementieren, und versuchen Sie immer, den UI-Thread von schweren Verarbeitungsaufgaben freizuhalten.

Entwickler können IronPDF mit seinemkostenlos testen bevor Sie sich zum Kauf entschließen. Der Einstiegspreis für eine Lizenz beträgt 749 Dollar.

< PREVIOUS
C# Volatile (Wie es für Entwickler funktioniert)
NÄCHSTES >
C# Nito.Asyncex (Wie es für Entwickler funktioniert)

Sind Sie bereit, loszulegen? Version: 2024.10 gerade veröffentlicht

Gratis NuGet-Download Downloads insgesamt: 11,308,499 Lizenzen anzeigen >