C#
 Computer >> コンピューター >  >> プログラミング >> C#

C#のマルチスレッドとは?Threadクラスの基本と使い方を解説

C#でマルチスレッドプログラミングを行う際には、System.Threading.Threadクラスを使用します。このクラスを利用することで、マルチスレッドアプリケーション内で個々のスレッドを作成し、自由に操作できるようになります。

プロセス内で最初に実行されるスレッドは「メインスレッド」と呼ばれます。C#プログラムの実行が開始されると、このメインスレッドは自動的に生成されます。そして、Threadクラスを使って新たに作成したスレッドは、メインスレッドに対する「子スレッド」として扱われます。

現在のスレッドを取得するサンプルコード

まずは、実行中のスレッド(メインスレッド)の情報を取得して表示する基本的な例を見てみましょう。

using System;
using System.Threading;

namespace Demo {
    class Program {
        static void Main(string[] args) {
            Thread th = Thread.CurrentThread;
            th.Name = "MainThread";
            Console.WriteLine("This is {0}", th.Name);
            Console.ReadKey();
        }
    }
}

このコードでは、Thread.CurrentThreadプロパティによって現在実行中のスレッドを取得し、「MainThread」という名前を設定してコンソールに出力しています。

子スレッドを作成・管理するサンプルコード

次に、ThreadStartデリゲートを使って子スレッドを作成し、その動きを管理する例を紹介します。子スレッド内ではThread.Sleep()メソッドにより、指定した時間だけ処理を一時停止させています。

using System;
using System.Threading;

namespace MultithreadingApplication {
    class ThreadCreationProgram {
        public static void CallToChildThread() {
            Console.WriteLine("Child thread starts");
            // スレッドを5000ミリ秒(5秒)間一時停止
            int sleepfor = 5000;
            Console.WriteLine("Child Thread Paused for {0} seconds", sleepfor / 1000);
            Thread.Sleep(sleepfor);
            Console.WriteLine("Child thread resumes");
        }

        static void Main(string[] args) {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");

            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}

実行結果

上記のプログラムを実行すると、以下のような出力が得られます。メインスレッドから子スレッドが生成され、5秒間の一時停止を挟んで処理が再開されていることが確認できます。

In Main: Creating the Child thread
Child thread starts
Child Thread Paused for 5 seconds
Child thread resumes

このように、C#ではThreadクラスとThreadStartデリゲートを組み合わせることで、簡単にマルチスレッド処理を実装できます。複数の処理を並行して実行したい場合や、時間のかかるタスクをバックグラウンドで処理したい場合に、マルチスレッドは非常に有効な手段となります。

  1. JavaのSwingWorkerクラスとは?GUIアプリで非同期処理を行う重要性と使い方を解説

    SwingWorkerクラスは、時間のかかる処理(長時間実行タスク)などをワーカースレッド上で非同期に実行し、その結果に基づいてイベントディスパッチスレッド(EDT)からSwingコンポーネントを安全に更新するための仕組みを提供します。このクラスはJava 1.6で導入されました。Swingでは、すべてのUI更新はEDT上で行う必要があります。しかし、EDT上で重い処理を直接実行すると画面がフリーズしてしまい、ユーザー体験を大きく損ないます。SwingWorkerを使えば、バックグラウンドでの処理とUIの更新を適切に分離できるため、応答性の高いデスクトップアプリケーションを実現できます。Swi

  2. JavaのSwingUtilitiesクラスとは?invokeAndWait()とinvokeLater()で実現するスレッドセーフなGUI操作

    JavaのSwingでは、コンポーネントが画面に表示された後、それらを操作できるのは「イベントディスパッチスレッド(Event Handling Thread)」と呼ばれる単一のスレッドだけです。これはSwingの重要な設計原則であり、複数のスレッドから同時にGUIを操作すると不整合や予期しない動作が発生するため、すべての描画・更新処理をこのスレッドに集約することで安全性を確保しています。開発者は、別途作成したコードブロックの参照をイベントディスパッチスレッドに渡すことができます。SwingUtilitiesクラスには、そのための2つの重要なstaticメソッド、invokeAndWait()