きな粉もち.net

.NET関連仕事に携わっています。OSSのソースを読んで気がついたことを中心に呟いたりブログに投稿したりしています。最近はUiPathを使ったRPAも研究中。気軽にフォローやツッコミよろしくおねがいします! Gitはここを使っています https://github.com/kinakomotitti

バックグラウンドスレッド × フォアグラウンドスレッド× 違いをたしかめてみた

この記事の目的

この記事では、
2種類のスレッドの違いについての動作の違いをまとめること
を目的としています。

本題

  1. スレッドの種類
  2. バックグラウンドスレッド
  3. フォアグラウンドスレッド
スレッドの種類

CLRで提供されているスレッドには、フォアグラウンドで実行されるものと、バックグラウンドで実行されるスレッドの2種類があります。
フォアグラウンドスレッドは、呼び出し元のスレッドが終了しても生き残ります。
そのため、ユーザー目線だと、ウィンドウを閉じたのにアプリが終了しない・・・
という状況が発生するものです。
逆に、バックグラウンドスレッドは、呼び出し元のスレッドが終了すると、強制的に処理が終了させられます。
そのため、ユーザーが意図したとおり、ウィンドウをすぐに閉じることができます。
途中になった処理をどうフォローするかは別の問題ですが・・・

どっちがより良いかについては、ケースバイケースだと思います。

が、

ユーザー「プロセスを終了したいと思い操作した。」

ということを考えると、ユーザーの思った通りに動作するバックグラウンドスレッドを優先して利用するべきだと思います。

バックグラウンドスレッド実験

以下のサンプルコードを実行して動作を確認してみます。

    static class Foreground_BackGround
    {
        public static void Main()
        {
            Thread thread = new Thread(Worker);
//バックグラウンドで動くように指定
            thread.IsBackground = true;
            thread.Start();
        }
        private static void Worker()
        {
            System.Threading.Thread.Sleep(10000);
        }
    }

実行すると、Main処理が終了すると同時にコンソール画面が閉じます。
これは、Workerの処理が実行中ですが、呼び出し元のスレッドが終了したため、
バックグラウンドスレッドも終了させられたことによります。

フォアグラウンドスレッド実験

同様のコードをフォアグラウンドように変更します。

    static class Foreground_BackGround
    {
        public static void Main()
        {
            Thread thread = new Thread(Worker);
//フォアグラウンドで動くように指定
            thread.IsBackground = false;
            thread.Start();
        }
        private static void Worker()
        {
            System.Threading.Thread.Sleep(10000);
        }
    }

実行すると、Main処理が終了してもコンソールが閉じることなく画面上にとどまります。
Workerが処理しているためです。(10秒間Sleepしています)
なお、Thread.IsBackgroundの規定はfalseです。
そのため何も設定しないと、フォアグラウンドスレッドとして処理が実行されます。

まとめ

しぶとく強く・・・フォアグラウンドスレッド
サバサバ  ・・・バックグラウンドスレッド