HeyCHのブログ

慢性疲労のへいちゃんです

【C#】別Thread(並列処理、非同期)って何よ

別Thread(並列処理、非同期)

C#では、別のThreadで処理を行う事で並列処理、非同期処理を行う事ができます。
簡単に言えば、処理を同時に複数個行う事ができるという事です。
以下に例を挙げてみましょう。

  1. 新しいプロジェクトの作成
    f:id:HeyCH:20200403010358p:plain
    新しいプロジェクトの作成
  2. コンソールアプリ(.NET Framework
    f:id:HeyCH:20200403010519p:plain
    コンソールアプリ(.NET Framework
  3. 作成
    f:id:HeyCH:20200403010626p:plain
    作成

ここにこんな感じで書いてみましょう。
2つの処理があって、それぞれ、1~1000を足す処理と、1~100を足す処理です。

        static void Main(string[] args) {
            var res1 = Sum1();
            var res2 = Sum2();
            Console.Read();
        }
        static int Sum1() {
            Console.WriteLine("計算1開始");
            var sum = 0;
            for (int i = 1; i <= 1000; i++){
                sum = sum + i;
            }
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("計算1合計=" + sum);
            return sum;
        }
        static int Sum2() {
            Console.WriteLine("計算2開始");
            var sum = 0;
            for (int i = 1; i <= 100; i++) {
                sum = sum + i;
            }
            System.Threading.Thread.Sleep(500);
            Console.WriteLine("計算2合計=" + sum);
            return sum;
        }

これを実行すると、以下のように表示されます。

計算1開始
計算1合計=500500
計算2開始
計算2合計=5050

では、これをそれぞれ別Threadで処理してみましょう。

        static void Main(string[] args) {
            int res1, res2;
            var t1 = new System.Threading.Thread(() => { res1 = Sum1(); });
            var t2 = new System.Threading.Thread(() => { res2 = Sum2(); });
            t1.Start();
            t2.Start();
            Console.Read();
        }
        static int Sum1() {
            Console.WriteLine("計算1開始");
            var sum = 0;
            for (int i = 1; i <= 1000; i++){
                sum = sum + i;
            }
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("計算1合計=" + sum);
            return sum;
        }
        static int Sum2() {
            Console.WriteLine("計算2開始");
            var sum = 0;
            for (int i = 1; i <= 100; i++) {
                sum = sum + i;
            }
            System.Threading.Thread.Sleep(500);
            Console.WriteLine("計算2合計=" + sum);
            return sum;
        }

結果はおそらく、以下のように表示されると思われます。
これが何を意味するのかというと、計算1と計算2がほぼ同時に実行され、結果は、計算2の方が早く計算されるという事です。
こういう風に処理を並列で行う事を別Threadで処理するとか、並列処理とか非同期処理とか言ったりします。(BackgroundWorkerも別Threadで処理してくれる頼もしいやつです)

計算1開始
計算2開始
計算2合計=5050
計算1合計=500500

ThreadとTask

Threadでももちろん良いのですが、ナウなヤング達はTaskを使って非同期処理を行います。
Taskを使うといろいろなことがスマートに書くことができます。(俺もよくわかってないのでここでは触れませんが)
結果はThreadのときと同じです。

        static void Main(string[] args) {
            int res1, res2;
            var t1 = Task.Run(() => { return Sum1(); });
            var t2 = Task.Run(() => { return Sum2(); });
            res1 = t1.Result;
            res2 = t2.Result;
            Console.Read();
        }
        static int Sum1() {
            Console.WriteLine("計算1開始");
            var sum = 0;
            for (int i = 1; i <= 1000; i++){
                sum = sum + i;
            }
            System.Threading.Thread.Sleep(1000);
            Console.WriteLine("計算1合計=" + sum);
            return sum;
        }
        static int Sum2() {
            Console.WriteLine("計算2開始");
            var sum = 0;
            for (int i = 1; i <= 100; i++) {
                sum = sum + i;
            }
            System.Threading.Thread.Sleep(500);
            Console.WriteLine("計算2合計=" + sum);
            return sum;
        }