フッターコンテンツにスキップ
.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を使用してバックグラウンドで処理することができます:

using System;
using System.Threading.Tasks;

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}");
}
using System;
using System.Threading.Tasks;

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}");
}
Imports System
Imports System.Threading.Tasks

Shared Async Function PerformComputation() As Task
	Dim result As Integer = Await Task.Run(Function()
		Dim sum As Integer = 0
		For i As Integer = 0 To 999999
			sum += i
		Next i
		Return sum
	End Function)
	Console.WriteLine($"The result is {result}")
End Function
$vbLabelText   $csharpLabel

出力

C# Task.Run (開発者向け動作方法): 図1 - 前のコードからのコンソール出力

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

非同期タスクとスレッドへのさらなる進展

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

複数のタスクの処理

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

using System;
using System.Threading.Tasks;

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;
}
using System;
using System.Threading.Tasks;

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;
}
Imports System
Imports System.Threading.Tasks

Shared Async Function HandleMultipleTasks() As Task
	Dim task1 As Task(Of Integer) = Task.Run(Function()
		Return PerformLongRunningWork("Task 1")
	End Function)

	Dim task2 As Task(Of Integer) = Task.Run(Function()
		Return PerformLongRunningWork("Task 2")
	End Function)

	' Wait for tasks to finish and print the results
	Dim results() As Integer = Await Task.WhenAll(task1, task2)
	Console.WriteLine($"Results of Task 1: {results(0)}, Task 2: {results(1)}")
End Function

Shared Function PerformLongRunningWork(ByVal taskName As String) As Integer
	Dim result As Integer = 0
	For i As Integer = 0 To 499999
		result += i
	Next i
	Console.WriteLine($"{taskName} completed.")
	Return result
End Function
$vbLabelText   $csharpLabel

出力

C# Task.Run (開発者向け動作方法): 図2

この例では、HandleMultipleTasksが2つの非同期タスクを開始します。 Task.WhenAllメソッドを使用して各非同期タスクを待機し、それらが同時に実行されることを可能にします。 両方のタスクが完了すると、次のコード行で続行されます。

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

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

CPU負荷の高い操作にTask.Runを使用する

Task.RunはCPU負荷が高い作業に使用するのが最適で、I/O負荷が高い操作のためには使用しないほうがいいです。 I/O負荷の高いタスクには、.NETライブラリに用意されている非同期I/O操作を使用してください。

スレッドプールスレッドに注意する

Task.Runがスレッドプールスレッドを使用していることを忘れないでください。 同時に多くの操作を実行することでこれらのスレッドを使い果たすと、タスクの開始時間が遅延し、アプリケーション全体が遅くなります。

同期コードを避ける

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

IronPDFの紹介

C# Task.Run (開発者向け動作方法): 図3 - IronPDFウェブページ

IronPDF is a C# library that lets you generate and manage PDFファイルを生成および管理できます。 これは.NET開発者向けに設計されており、ブラウザで見えるものがPDFに正確に反映されるように、既にあるWebコンテンツを使ってPDF作成を簡素化します。 これらはWeb、デスクトップ、サーバーを基盤としたさまざまな.NETアプリケーションに適しており、PDFの編集、フォーム処理、ドキュメントのセキュリティ作成などの機能を提供します。

簡単に言うと、IronPDFはWebページを簡単かつ正確にPDFに変換するのに役立ちます。 複雑なAPIを手間取る必要はありません。HTMLでページをデザインし、IronPDFが残りを行います。これは異なる.NETプラットフォームで機能し、PDFの調整、セキュリティおよび対話に使えるツールを提供します。

Task.Runを使用したIronPDF

コード例

こちらはIronPDFTask.RunでC#で使用するシンプルな例です。 この例は、HTMLコンテンツから非同期にPDFを生成する方法を示します。 これは特にデスクトップアプリケーションでのUIフリーズを回避したり、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");
    }

    // Main method to execute the PDF generation
    public static void Main()
    {
        // Set the license key for IronPDF
        License.LicenseKey = "License-Key";

        // Calling the async PDF generation method and blocking the Main thread until completion
        Task.Run(async () => await PdfGenerator.CreatePdfAsync()).Wait();

        // Inform the user that the PDF generation is complete
        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");
    }

    // Main method to execute the PDF generation
    public static void Main()
    {
        // Set the license key for IronPDF
        License.LicenseKey = "License-Key";

        // Calling the async PDF generation method and blocking the Main thread until completion
        Task.Run(async () => await PdfGenerator.CreatePdfAsync()).Wait();

        // Inform the user that the PDF generation is complete
        System.Console.WriteLine("PDF generated.");
    }
}
Imports IronPdf
Imports System.Threading.Tasks

Public Class PdfGenerator
	Public Shared Async Function CreatePdfAsync() As Task
		Dim renderer = New ChromePdfRenderer()
		Dim htmlContent = "<h1>Hello, IronPDF!</h1><p>This is an async PDF generation.</p>"

		' Run the PDF generation in a separate task
		Dim pdf = Await Task.Run(Function() renderer.RenderHtmlAsPdf(htmlContent))

		' Save the PDF to a file
		pdf.SaveAs("asyncIronPDF.pdf")
	End Function

	' Main method to execute the PDF generation
	Public Shared Sub Main()
		' Set the license key for IronPDF
		License.LicenseKey = "License-Key"

		' Calling the async PDF generation method and blocking the Main thread until completion
		Task.Run(Async Function() Await PdfGenerator.CreatePdfAsync()).Wait()

		' Inform the user that the PDF generation is complete
		System.Console.WriteLine("PDF generated.")
	End Sub
End Class
$vbLabelText   $csharpLabel

出力

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

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

結論

C# Task.Run (開発者向け動作方法): 図5 - IronPDFライセンスページ

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

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

よくある質問

C#でタスクを非同期に実行するにはどうすればよいですか?

CPUバウンドまたはI/Oバウンドの操作を別のスレッドプールのスレッドで非同期に実行するにはTask.Runメソッドを使用できます。これによりメインスレッドのブロックを防ぎ、アプリケーションの応答性を向上させます。

非同期プログラミングにTask.Runを使用する利点は何ですか?

Task.Runは長時間実行されるタスクをバックグラウンドスレッドにオフロードすることで、アプリケーションのパフォーマンスを向上させ、スレッドプールを効率的に利用します。これによりUIスレッドが応答性を維持し、新しいスレッドの作成に関連するオーバーヘッドを回避できます。

C#でPDFを生成するためにTask.Runを使用できますか?

はい、C#でIronPDFのようなライブラリを使用する場合、PDFを非同期に生成するのにTask.Runを使用できます。このアプローチにより、PDF生成タスクがメインアプリケーションスレッドをブロックしないようにして、パフォーマンスをスムーズにします。

C#アプリケーションでTask.Runを使用するためのベストプラクティスとは何ですか?

Task.Runを使用する際は、CPUバウンドタスクに限定し、I/Oバウンドタスクには使用しないようにしましょう。また、Task.WaitTask.Resultのような同期待機を避け、デッドロックを防ぎスレッドプールの使用を効果的に管理します。

Task.Runで複数のタスクを同時に管理するにはどうすればよいですか?

開発者はTask.Runを使用して複数のタスクを開始し、Task.WhenAllでそれらの完了を待つことにより管理できます。これにより、独立した操作の効率的な並行実行が可能になります。

なぜ非同期プログラミングがC#で重要なのですか?

非同期プログラミングは、実行をブロックする可能性のある操作(ネットワーク呼び出しや重い計算など)を扱う際に、応答性のあるアプリケーションを開発するために重要です。リソースの管理が改善され、ユーザーエクスペリエンスが向上します。

Task.Runがアプリケーションのデッドロックを防ぐのにどのように役立ちますか?

Task.Runはタスクを非同期に実行し、メインスレッドをブロックしないことでデッドロックを防ぎます。しかし、同期待機を避け、スレッドプールのリソースを適切に管理してデッドロックのリスクを軽減することが重要です。

C#でHTMLコンテンツからPDFを生成するのに役立つツールは何ですか?

IronPDFは、C#でHTML、CSS、JavaScriptからPDFを生成できるライブラリです。これにより、開発者はWebコンテンツを正確に反映するPDFを簡単に作成できます。

Curtis Chau
テクニカルライター

Curtis Chauは、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。