Help us understand the problem. What is going on with this article?

C#学習 -非同期処理-

More than 1 year has passed since last update.

C#学習中のため、学習内容をメモしていく。
間違いやアドバイスがあればコメントからよろしくお願いします。

Task処理

Task処理に関して少し勘違いしていたのでメモ

        void TaskSample()
        {
            Task.Run(() =>
            {
                HeavyMethod();
            });

            Console.WriteLine("おはよう");
        }

        void HeavyMethod()
        {
            // 重い処理
            Thread.Sleep(1000);
            Console.WriteLine("こんばんは");
        }

おはよう
こんばんは

別メソッドで非同期に動く処理はTask.Runで囲まれたHeavyMethodメソッドのみ。「おはよう」表示処理はHeavyMethodメソッド後に実行されると勘違いしていた。

「おはよう」表示を「こんばんは」より後にしたい場合は、HeavyMethodメソッドの終了を待つようにする。

        async Task TaskSample()
        {
            await Task.Run(() =>
            {
                HeavyMethod();
            });

            Console.WriteLine("おはよう");
        }

        void HeavyMethod()
        {
            // 重い処理
            Thread.Sleep(1000);
            Console.WriteLine("こんばんは");
        }
こんばんは
おはよう

HeavyMethodメソッドの戻り値を受け取りたいときはこうする。

        async Task TaskSample()
        {
            string str = await Task.Run(() => HeavyMethod());

            Console.WriteLine(str);
        }

        string HeavyMethod()
        {
            // 重い処理
            Thread.Sleep(1000);
            Console.WriteLine("こんばんは");

            return "こんにちは";
        }
こんばんは
こんにちは

string str = await Task.Run(() => { HeavyMethod(); });
{}をいれいると「型voidをstringに暗黙的に変換できません」とエラーになる。

参考した記事

https://qiita.com/acple@github/items/8f63aacb13de9954c5da

https://qiita.com/Alupaca1363Inew/items/0126270bca99883605de

おわり。

choni-k
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away