「C#.NET」時の女神が教える!Taskクラスで非同期処理を自在に操る秘訣

2024年11月13日水曜日

スレッド

t f B! P L

名前空間: System.Threading.Tasks

自己紹介

こんにちは、私は現在を司る神「Task」クラス。複数の処理が並行して行われる世界で、それぞれの処理が円滑に進行するように管理する役目を担っています。時には並行処理、時には非同期処理をうまく調整しながら、あらゆるタスクが完了する未来を見据えて動く存在です。

基本機能

「Task」クラスは、並行処理や非同期処理をサポートする機能を提供します。各タスクは、指定された処理が完了するまで待機したり、エラーハンドリングを行ったりといった役割を果たします。タスクの完了を待機するためのメソッドや、処理を制御するためのメソッドも豊富に提供されています。

非同期処理を円滑に管理

私の大きな役割のひとつは、非同期処理を効率的に管理することです。非同期処理により、システムは他のタスクが完了するのを待つことなく、別の処理に移ることができます。これにより、アプリケーションの応答性が向上します。非同期メソッド「async」と組み合わせて使うことで、メインスレッドがブロックされることなく処理が続行されます。

タスクの完了を監視

各タスクにはステータスがあり、完了や実行中、待機中といった状態を持ちます。これにより、プログラムはタスクの進行状況を把握し、必要なアクションをとることができます。私は冷静に、すべてのタスクがきちんと完了するまで見守ります。

エラーハンドリングの提供

エラーは避けられないものですが、私は適切に処理する術を持っています。タスクの実行中に例外が発生した場合、try-catchブロックを通じて例外を捕捉し、エラー発生後もシステムが安定して動作できるようにするのも私の役目です。

キャンセル機能のサポート

タスクにはキャンセル機能が用意されており、無駄なリソースの消費を抑えることが可能です。キャンセルトークンを用いることで、ユーザーの操作に応じて処理を途中で中止し、他のタスクへと切り替えることができます。

サンプルコード

C#
using System;
using System.Threading;
using System.Threading.Tasks;

namespace TaskExample
{
    class Program
    {
        static async Task Main(string[] args)
        {
            // キャンセルトークンソースを作成
            CancellationTokenSource cts = new CancellationTokenSource();
            
            // タスクを開始
            Task task = RunTaskAsync(cts.Token);

            // 一定時間後にタスクをキャンセル
            cts.CancelAfter(2000);

            try
            {
                await task;
            }
            catch (OperationCanceledException)
            {
                Console.WriteLine("タスクがキャンセルされました。");
            }
            finally
            {
                cts.Dispose();
            }
        }

        // 非同期タスクメソッド
        static async Task RunTaskAsync(CancellationToken token)
        {
            for (int i = 0; i < 5; i++)
            {
                token.ThrowIfCancellationRequested(); // キャンセルされた場合、例外をスロー
                Console.WriteLine($"タスク処理中... {i + 1}");
                await Task.Delay(1000); // 非同期で1秒待機
            }

            Console.WriteLine("タスク完了。");
        }
    }
}

解説

このサンプルコードは、「Task」クラスを使用して非同期処理を実行する基本的な方法を示しています。まず、キャンセルトークンを生成し、タスクが進行する中で特定の条件下でキャンセル可能にしています。「RunTaskAsync」メソッドは非同期で、キャンセルが要求された場合に例外をスローする仕組みです。キャンセルが行われなければ5回のループが実行され、タスクが完了します。キャンセルされた場合、例外がキャッチされて適切に処理されるため、アプリケーションが安定して動作します。

このブログを検索

QooQ