LoginSignup
4
3

More than 5 years have passed since last update.

asyncの微妙な引っかかりどころ

Posted at

皆さんは既に元気にasync/awaitを使いこなされているかとは思いますが、個人的に引っかかったところを備忘録にしておこうと思います。
なお推論コミです。

まずはコードから。

async.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace test
{
    class Program
    {
        static void Main(string[] args)
        {
            //Main内でasyncする場合はTaskを用意して走らせる必要がある。
            var task = Task.Run(async () =>
            {
                //1.ここでawaitすると同期処理に
                var alpha = GetsSum(5);
                var bravo = GetsSum(7);
                //2.ここでawaitすると非同期処理に
                int a = await alpha;
                int b = await bravo;

                Console.WriteLine($"{a}+{b}={a + b}");
            });

            Console.ReadLine();
        }

        //一定時間ごとに値を加算、コンソールに出力する。
        static async Task<int> GetsSum(int interval)
        {
            Console.WriteLine($"task start interval {interval}");
            var intTask = Task<int>.Run(() =>
            {
                var sum = 0;

                for (int i = 0; i < 1000/interval; i++)
                {
                    sum += i;
                    Console.WriteLine($"interval {interval}'s sum : {sum}");
                    Thread.Sleep(interval);
                }

                return sum;
            });

            return await intTask;
        }
    }
}

単純に加算していくプログラムですが、awaitをかける部分を間違えると同期処理になってしまいます。
1.の部分でかけると同期処理に。2.の部分でかければ非同期処理になりました。
宣言時にawaitをかけると引っかかるのかなーと思った次第でした

4
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3