ちおさん雑記帳

何の役にも立たない雑記から、誰かの役に立つ(かも知れない)メモなど・・

C# Task.Run()で時間の掛かる処理を別スレッドで実行させる

今更備忘録シリーズ第x段
ということで、Task.Run()で時間の掛かる処理を別スレッドで実行させるコード。
意外と分かりにくい(そうでもないかも)のは、別スレッドで実行させた処理が完了していなくても、
Task.Run()以降の行も(完了を待たずに)実行されるという話。
以下、簡単なサンプル

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

namespace Sample1
{
    public class SampleClassA
    {
        public void ProcessA()
        {
            Task<bool> task = Task.Run(() => HeavyMethod()); // 別スレッドで重いメソッドを実行するが
            Console.WriteLine(task.Status.ToString());       // await指定やResultアクセスがない場合はすぐ次の行が実行される
                                                              // ここでは WaitingToRun
            bool b = task.Result; // TaskのResult(この場合bool値)を取得しようとすると、別スレッドの実行が終了するまでここで待つ
            Console.WriteLine(task.Status.ToString()); // ここでは RanToCompletion
        }
        private bool HeavyMethod()
        {
            Thread.Sleep(3000); // 重い処理
            return true;
        }
    }
}