【C#】スレッドで並列処理を行う

C#

マルチスレッドプログラミングは、アプリケーションのパフォーマンスを向上させる強力な方法です。C#においては、比較的簡単にスレッドを作成して利用することができます。

サンプルコード

以下のサンプルコードは、2つのスレッドを並列実行させています。スレッド1はカウンタを10からカウントダウンします。スレッド2は、A~Jまでアルファベットを順番に表示します。

using System;
using System.Threading;

class Program
{
    static void Main(string[] args)
    {
        // スレッドの作成と開始: タスク1
        Thread thread1 = new Thread(new ThreadStart(Task1));
        thread1.Start();
        
        // スレッドの作成と開始: タスク2
        Thread thread2 = new Thread(new ThreadStart(Task2));
        thread2.Start();

        // 両スレッドの終了をメインスレッドが待機
        thread1.Join();
        thread2.Join();

        Console.WriteLine("Both tasks completed.");
    }

    // タスク1: 数をカウントダウン
    static void Task1()
    {
        for (int i = 10; i >= 0; i--)
        {
            Console.WriteLine($"Task 1 counting down: {i}");
            Thread.Sleep(500); // 0.5秒間隔でカウントダウン
        }
    }

    // タスク2: アルファベットを表示
    static void Task2()
    {
        for (char c = 'A'; c <= 'J'; c++)
        {
            Console.WriteLine($"Task 2: {c}");
            Thread.Sleep(300); // 0.3秒間隔でアルファベットを表示
        }
    }
}

実行結果

Task 2: A
Task 1 counting down: 10
Task 2: B
Task 1 counting down: 9
Task 2: C
Task 2: D
Task 1 counting down: 8
Task 2: E
Task 1 counting down: 7
Task 2: F
Task 2: G
Task 1 counting down: 6
Task 2: H
Task 2: I
Task 1 counting down: 5
Task 2: J
Task 1 counting down: 4
Task 1 counting down: 3
Task 1 counting down: 2
Task 1 counting down: 1
Task 1 counting down: 0
Both tasks completed.
続行するには何かキーを押してください . . .

解説

スレッドの作成と開始

スレッドは Thread クラスを使って作成します。この例では、Task1 と Task2 という2つのメソッドをそれぞれ別のスレッドで実行しています。new ThreadStart(Task1) は、Task1 メソッドをスレッドで実行するためのデリゲートを作成しています。Start メソッドを呼び出すことで、スレッドの実行が開始されます。

スレッドの終了の待機

Join メソッドを使用して、メインスレッドが2つのスレッドの終了を待つようにしています。これにより、両方のタスクが完了するまでプログラムは終了しません。

タスクの実装

Task1 と Task2 では、それぞれ異なるタスクを実行しています。Task1 は数をカウントダウンし、Task2 はアルファベットの文字を表示します。Thread.Sleep メソッドを使用して、各タスクの間に短い遅延を設けています。

スレッドを使う際のポイント

  • スレッドの安全な終了: スレッドがリソースを共有する場合、スレッドが安全に終了するように管理することが重要です。不適切な終了はデータの破損を引き起こす可能性があります。
  • データの同期:複数のスレッドが同じデータにアクセスする場合、同期メカニズム(例: lock ステートメントなど)を使用して、一度に1つのスレッドのみがデータを変更できるようにします。
  • パフォーマンスの監視: スレッドを多用すると、コンテキストスイッチによるオーバーヘッドが発生することがあります。アプリケーションのパフォーマンスを定期的に監視し、最適なスレッド数を見極めることが大切です。

まとめ

スレッドを使う方法を学ぶことは、プログラミングスキルの向上に役立ちます。この記事で紹介したサンプルコードを実際に試してみてスレッドの基本的な使い方を理解しましょう。

タイトルとURLをコピーしました