C#でスレッドを操作する方法

スレッドは、プロセス内の実行の最小単位です。マルチスレッドとは、特定の時間に複数のスレッドをメモリに保持し、それらを切り替えて複数の操作を同時に処理する機能です。Microsoftの.NetFrameworkは、スレッドの操作に優れたサポートを提供します。

C#でのプログラミングスレッド

スレッドを操作するには、アプリケーションにSystem.Threading名前空間を含める必要があります。新しいスレッドを作成するには、ThreadStartデリゲートを利用して、スレッドで実行する必要のあるメソッドへの参照を渡す必要があります。デリゲートはタイプセーフな関数ポインタであることに注意してください。次のコードスニペットは、このデリゲートを使用して新しいスレッドオブジェクトを作成する方法を示しています。

 スレッドt = new Thread(new ThreadStart(MyThreadMethod)); 

新しく作成されたスレッドを開始するには、作成したスレッドオブジェクトでStartメソッドを呼び出す必要があります。次のコードリストはこれを示しています。スレッドメソッドMyThreadMethodは、作成された新しいスレッド(ワーカースレッドと呼ばれる)で実行されることに注意してください。

 static void Main()

        {{

            スレッドt = new Thread(new ThreadStart(MyThreadMethod));

            t.Start();           

            Console.Read();

        }

        static void MyThreadMethod()

        {{

            Console.WriteLine( "Hello World!");

        }

C#でスレッドの状態を表示する

メモリ内のスレッドは、さまざまな状態(Aborted、Background、Running、Stopped、Suspended、Unstartedなど)になります。スレッドの状態は、System.Threading名前空間で使用可能なThreadState列挙で定義されます。スレッドでStartメソッドが呼び出されない限り、スレッドはUnstarted状態になります。スレッドインスタンスでStartメソッドが呼び出されると、スレッドの状態がUnstartedからRunningに変わります。

次のコードスニペットは、コンソールでスレッドの状態を表示する方法を示しています。

 スレッドt = new Thread(new ThreadStart(MyThreadMethod));

t.Start();

Console.WriteLine( "スレッドの状態は次のとおりです:" + t.ThreadState.ToString());

C#でフォアグラウンドスレッドとバックグラウンドスレッドを制御する

スレッドは、フォアグラウンドまたはバックグラウンドのいずれかで実行できます。明示的に作成するスレッドはフォアグラウンドスレッドです。フォアグラウンドスレッドとバックグラウンドスレッドの主な違いの1つは、1つ以上のフォアグラウンドスレッドが実行されている間だけアプリケーションが存続することです。本質的に、フォアグラウンドスレッドは、アプリケーションが終了するのを防ぎます。対照的に、バックグラウンドスレッドは、共通言語ランタイム環境を存続させません。

IsBackgroundプロパティを使用して、スレッドのバックグラウンドステータスを設定できます。これを実現する方法を示すコード例を次に示します。

 static void Main()

        {{

            スレッドt = new Thread(new ThreadStart(MyThreadMethod));

            t.Start();

            t.IsBackground = true;

            Console.WriteLine( "スレッドのバックグラウンドステータスは次のとおりです:" + t.IsBackground.ToString());

            Console.Read();

        }

スレッドオブジェクトでSuspend()メソッドとResume()メソッドを呼び出すことにより、スレッドを一時停止または再開できます。Suspend()メソッドを呼び出すことによってのみ、以前に中断したスレッドを再開できることに注意してください。

 スレッドt = new Thread(new ThreadStart(MyThreadMethod));

t.Start();

t.Suspend(); //新しく作成されたスレッドを一時停止します

t.Resume(); //中断されたスレッドを再開します

ただし、Thread.Suspend()メソッドとThread.Resume()メソッドは非推奨になっていることに注意してください。むしろ、AutoResetEventメソッドとEventWaitHandleメソッドを使用して、スレッドに関連するアクティビティを同期する必要があります。

C#でスレッドの優先度を設定する

スレッドの優先度を制御して、メモリ内にある他のスレッドと比較して、スレッドが取得するプロセッサ時間の相対的な割合を決定できます。スレッドの優先度は、ThreadPriority列挙で定義されます。可能な値には、Lowest、BelowNormal、Normal、AboveNormal、およびHighestが含まれます。次のコードスニペットは、スレッドオブジェクトのPriorityプロパティを使用して、2つのスレッドのスレッド優先度を設定する方法を示しています。

 static void Main()

        {{

            スレッドthread1 = new Thread(new ThreadStart(Method1));

            スレッドthread2 = new Thread(new ThreadStart(Method2));

            thread1.Priority = ThreadPriority.Highest;

            thread2.Priority = ThreadPriority.Lowest;

            thread2.Start();

            thread1.Start();

            Console.Read();

        }

        static void Method1()

        {{

            for(int i = 0; i <10; i ++)

            {{

                Console.WriteLine( "最初のスレッド:" + i);

            }

        }

        static void Method2()

        {{

            for(int i = 0; i <10; i ++)

            {{

                Console.WriteLine( "2番目のスレッド:" + i);

            }

        }

上記のコードスニペットを実行すると、Mainメソッドの最初のスレッドの前に2番目のスレッドが開始された場合でも、最初のスレッドが2番目のスレッドの前に実行を完了することがわかります。

スレッドは高価です。これらは、初期化、コンテキストの切り替え、および消費したリソースの解放のために、システム内の多くのリソースを消費します。したがって、マルチスレッドは、必要な場合にのみ慎重に使用する必要があります。マルチスレッドを利用する場合は、スレッドプールを活用して、オンデマンドでスレッドを作成および管理し、アプリケーションの応答性を向上させることを常にお勧めします。