.NET ヘルプ

C# Task.Run(開発者のためのタスク実行方法)

更新済み 8月 13, 2024
共有:

イントロダクション

この記事では、その基本を掘り下げる。 タスク.ラン」。 非同期プログラミングの強力な構成要素である。 非同期プログラミングは、応答性の高い効率的なアプリケーションを書くために不可欠です。特に、ネットワーク呼び出しや激しい計算タスクのように、アプリケーションの実行をブロックする可能性のある処理を扱う場合には、非同期プログラミングは不可欠です。 Task.Runは、これらの処理をバックグラウンドのスレッドにオフロードし、アプリケーションのパフォーマンスと応答性を向上させるために、一般的に使用される非同期メソッドの1つです。 ここでは、Task.Runメソッドと IronPDFライブラリ それで。

Task.Runを理解する

Task.Runは.NET Coreが提供する呼び出しメソッドで、開発者はCPUバウンドコードやI/Oバウンド操作をスレッドプールとは別のスレッドで非同期に実行できる。 この方法は、非同期スレッドを使用して長時間実行する処理を実行することで、UIスレッドの応答性を維持するのに有効です。 これは、別のスレッドで新しい非同期処理を開始し、awaitキーワードを使ってその処理を待機させることを簡単にする。

Task.Runの基本的な使い方

単純な例として、長い計算をする必要がある場合を考えてみよう。 これをメインスレッドで直接実行するとUIがブロックされてしまう代わりに、Task.Runを使ってバックグラウンドで処理することができる:

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#

出力

C# Task.Run(開発者のための仕組み):図1 - 先ほどのコードのコンソール出力

上の例では、Task.Run内のラムダ式は、大きな数値範囲を合計するCPUバウンドコードのブロックを表している。 Task.Runを使用すると、この計算がバックグラウンド・スレッドにオフロードされ、メイン・ス レッドが応答性を維持できるようになります。await**タスクキーワードは、現在のスレッドをブロックすることなく、タスクが完了するまで非同期に待機するために使用されます。

非同期タスクとスレッドへの深入り

Task.Runを呼び出すと、.NET Frameworkはスレッドプールから指定されたタスクを実行するスレッドを割り当てます。 これは、タスクごとに新しいスレッドを作成するオーバーヘッドを回避し、システム・リソースをより効果的に活用するのに役立つため、効率的である。 スレッドプールは、アプリケーションのワーカースレッドのセットを管理し、複数のコアで複数のタスクを同時に実行できる。

複数のタスクを処理する

新しいタスクは、Task.Runを使用して同時に実行することができます。これは、複数の独立した処理を同時に実行する必要があるアプリケーションにとって有益です。 ここでは、複数のタスクを開始する方法を説明します:

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#

出力

C# タスク実行 (開発者向けの仕組み):図2

この例では、HandleMultipleTasksが2つの非同期タスクを開始する。 Task.WhenAll**メソッドは、各非同期タスクを待機させるために使用される。 両方のタスクが完了すると、次のコード行に進む。

ベストプラクティスと考慮事項

Task.Runは非同期プログラミングのための貴重なツールですが、システム・リソースを使いすぎたり、アプリケーションに予期せぬ動作を引き起こしたりといったよくある落とし穴を避けるために、賢く使うことが重要です。

CPUバウンド処理にはTask.Runを使う

CPUバウンドの作業にはTask.Runを使用し、I/Oバウンドの操作には使用しないのがベストである。 I/Oバウンドタスクには、.NETライブラリで利用可能な非同期I/O操作を使用する。

スレッドプールのスレッドに注意

Task.Run**はスレッド・プールのスレッドを使用することを忘れないでほしい。 多くの同時処理を実行することでこれらのスレッドを使い果たすと、タスクの開始時間が遅れたり、アプリケーション全体の動作が重くなったりする可能性がある。

同期コードを避ける

Task.Runによって開始されたタスクを待機させる場合、Task.ResultTask.Waitメソッドのような同期待ちを使用することは、特にUIアプリケーションのようなコンテキストではデッドロックにつながる可能性があるため避けてください。

IronPDFの紹介

C# タスク実行 (開発者向けの仕組み):図3 - IronPDFのウェブページ

IronPDF を生成・管理するC#ライブラリです。 HTMLから直接PDFファイルCSS、JavaScript。 .NET開発者のために設計され、すでに持っているウェブコンテンツを使用することでPDF作成を簡素化し、ブラウザで見たものがそのままPDFになるようにします。 .NETアプリケーションは、ウェブ、デスクトップ、サーバーベースのいずれにも適しており、PDF編集、フォーム処理、安全な文書作成などの機能を備えています。

簡単に言えば、IronPDFはウェブページを簡単かつ正確にPDFにするお手伝いをします。 複雑なAPIを扱う必要はありません。HTMLでページをデザインするだけで、あとはIronPDFがやってくれます。IronPDFは様々な.NETプラットフォームで動作し、PDFを調整、保護、操作するツールを提供します。

タスク実行とIronPDF

コード例

以下はC#でIronPDFTask.Runを使用する簡単な例です。 この例では、HTMLコンテンツから非同期にPDFを生成する方法を示します。 これは特に、デスクトップ・アプリケーションでUIがフリーズするのを防いだり、ウェブ・アプリケーションの負荷を管理したりするのに役立つ:

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#

出力

C# タスク実行 (開発者向けの仕組み):図4 - IronPDFとTask.Runコード例から出力されたPDF

こ の例は、 PDF 生成を Task 内に カプセル化 し てい る ので、 非ブ ロ ッ ク 処理を必要 と す る アプ リ ケーシ ョ ンに適しています。

結論

C# タスク実行 (開発者向けの仕組み):図5 - IronPDFライセンスページ

Task.Runは、非同期タスクを効率的に管理するためのC#の強力な機能です。 正しい使い方を理解することで、アプリケーションのパフォーマンスと応答性を向上させることができる。 非同期操作の実装方法を決定する際には、タスクがCPUバウンドかI/Oバウンドかを考慮することを忘れないようにし、常にUIスレッドを重い処理タスクから解放することを目指す。

開発者はIronPDFをテストすることができます。無料体験 購入を決める前に。 ライセンスの開始価格は749ドル。

< 以前
C#の揮発性(開発者のための仕組み)
次へ >
C# Nito.Asyncex (開発者のための仕組み)

準備はできましたか? バージョン: 2024.9 新発売

無料のNuGetダウンロード 総ダウンロード数: 10,659,073 View Licenses >