C#でasync/awaitのテスト。

環境

VisualStudio Pro 2017
.NET Framework 4.7.2
コンソールアプリケーション

参考にしたサイト

C# 今更ですが、await / async

コード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Threading;

namespace _20190925_AsyncTest
{
    class Program
    {
        static void Main(string[] args)
        {
            Program program = new Program();

            int[] intTemp = new int[5];

            // ===== ここから 通常の同期処理 =====
            for (int i = 0; i < 5; i++)
            {
                intTemp[i] = program.Calculate();
                Console.WriteLine("同期処理 : {0}", i);
            }
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("{0}がCalculate()の結果です。", intTemp[i]);
            }

            Console.WriteLine("エンターキーを入力して下さい。");
            Console.ReadLine();
            // ===== ここまで 通常の同期処理 =====

            // ===== ここから 非同期処理(この場合並列処理かも) =====
            Task<int>[] tasks = new Task<int>[5];

            for (int i = 0; i < 5; i++)
            {
                tasks[i] = program.CalculateAsync();
                Console.WriteLine("非同期処理 : {0}", i);
                // ここにtasks[i].Resultと書かれた文があると同期処理と同じになる。
                
            }
            for (int i = 0; i < 5; i++)
            {
                Console.WriteLine("{0}がCalculateAsync()の結果です。", tasks[i].Result);
            }

            Console.WriteLine("エンターキーを入力して下さい。");
            Console.ReadLine();
            // ===== ここまで 非同期処理(この場合並列処理かも) =====
        }

        int Calculate()
        {
            // このメソッドは4秒かかる処理。
            int total = 0;
            for (int i = 0; i <= 100; i++)
            {
                total += i;
                Thread.Sleep(40);
            }

            return total;
        }

        private async Task<int> CalculateAsync()
        {
            // Calculate()メソッドを非同期に実行するためのメソッド。
            var task = Task.Run(new Func<int>(this.Calculate));
            var result = await task;
            return result;
        }

    }
}

コメント

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