.NET ヘルプ

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

イントロダクション

この記事では、C#の非同期プログラミングにおける強力な構造であるTask.Runの基本を掘り下げます。 非同期プログラミングは、応答性の高い効率的なアプリケーションを書くために不可欠です。特に、ネットワーク呼び出しや激しい計算タスクのように、アプリケーションの実行をブロックする可能性のある処理を扱う場合には、非同期プログラミングは不可欠です。 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
$vbLabelText   $csharpLabel

出力

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

出力

C# Task.Run(開発者向けの仕組み):図2

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

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

Task.Run は非同期プログラミングにおいて貴重なツールですが、システムリソースの過剰使用やアプリケーションでの予期しない動作を引き起こすなどの一般的な落とし穴を避けるために賢明に使用することが重要です。

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

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

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

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

同期コードを避ける

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

IronPDFの紹介

C# Task.Run(開発者向けの仕組み):図3 - IronPDFウェブページ

IronPDF は、HTML、CSS、JavaScript から直接 PDF ファイルを生成および管理 できる C# ライブラリです。 .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
$vbLabelText   $csharpLabel

出力

C# Task.Run(開発者向けの作動方法):図4 - IronPDFとTask.Runコード例から出力されたPDF

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

結論

C# Task.Run(開発者向けの仕組み):図5 - IronPDFのライセンスページ

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

開発者は購入を決定する前に、無料試用を使用してIronPDFをテストできます。 ライセンスの開始価格は$749です。

チペゴ
ソフトウェアエンジニア
チペゴは優れた傾聴能力を持ち、それが顧客の問題を理解し、賢明な解決策を提供する助けとなっています。彼は情報技術の学士号を取得後、2023年にIron Softwareチームに加わりました。現在、彼はIronPDFとIronOCRの2つの製品に注力していますが、顧客をサポートする新しい方法を見つけるにつれて、他の製品に関する知識も日々成長しています。Iron Softwareでの協力的な生活を楽しんでおり、さまざまな経験を持つチームメンバーが集まり、効果的で革新的な解決策を提供することに貢献しています。チペゴがデスクを離れているときは、良い本を楽しんだり、サッカーをしていることが多いです。
< 以前
C#の揮発性(開発者のための仕組み)
次へ >
C# Nito.Asyncex (開発者のための仕組み)