asyncってかんたん!?

今回は非同期処理についてです。

C#では処理をバックグラウンドに投げる非同期処理が簡単に…………できました。
サンプルコードは下記のとおりです。

非同期処理にするにはざっくりとして以下の通りです。

  • 非同期処理を行うメソッドをasyncで修飾して戻り値をvoid、Task、Task(T)のどれかにする
  • メソッド内で非同期にしたい処理をawait Task.Runの中にラムダ式で書き込む。
  • 戻り値を持つ場合はタスクを変数に取り込み、Resultプロパティで結果を取り出す。

実用するにはどうやるのかなー、というのはありますけどね(汗

using System;
using System.Linq;
using System.Threading.Tasks;

namespace AsyncExperiment
{
    class Program
    {
        static void Main(string[] args)
        {
            //戻り値を持つ場合はこのように行う
            var alpha = AsyncRunner.Factional(1, 10);
            Console.WriteLine("10の階乗は{0}です", alpha.Result);

            //戻り値を持たない場合はこんな感じで良い
            AsyncRunner.AsyncMethod(1, 10);
            AsyncRunner.AsyncMethod(2, 10);
            AsyncRunner.AsyncMethod(3, 10);
        }
    }

    /// <summary>
    /// このクラスでは非同期処理の試験メソッドを提示します。
    /// </summary>
    public class AsyncRunner
    {
        /// <summary>
        /// <para>非同期メソッド1.試験用コール</para>
        /// <para>このメソッドについては繰り返し処理が非同期的に行われていることを試験するためのものです。</para>
        /// <para>出力パターンは "CallNumber = {0} Looping = {1}" と出力されます。</para>
        /// </summary>
        /// <param name="CallNumber">試験用コールナンバー</param>
        /// <param name="Looping">ループ回数</param> 
        public static async Task AsyncMethod(int CallNumber,int Looping)
        {
            await Task.Run(() =>
            {
                foreach (int Progress in Enumerable.Range(1, Looping))
                {
                    Console.WriteLine("CallNumber = {0} Looping = {1}", CallNumber, Progress);
                    System.Threading.Thread.Sleep(500);
                }
            });

        }

        public static async Task<int> Factional(int CallNumber,int Value)
        {
            int val;
            val = await Task.Run(() =>
            {
                int result=1;

                foreach(int Progress in Enumerable.Range(1, Value))
                {
                    result *= Progress;
                    Console.WriteLine("Method{0} Calcurating... Value = {1}", CallNumber, result);
                    System.Threading.Thread.Sleep(500);
                }

                Console.WriteLine("Calcurate Complete Value is {0}", result);

                return result;
            });

            return val;
        }
    }
}