C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

■93845 / 2階層)  async/awaitのWaitAllの挙動について
□投稿者/ ぱっくん (2回)-(2020/02/10(Mon) 13:48:59)
Hongliangさん、ありがとうございます。具体的なご指導に加えて丁寧な解説までいただき感激しています。
UIスレッドの中で非同期処理をするのには注意が必要とのこと承知しました。

下記のコードで動作するようになりました (非同期処理の理解確認用なのでいろいろツッコミどころはあるのは承知しています)。

Form1.cs
        private async void button1_Click(object sender, EventArgs e)
        {
            var ts = new TestRunner();
            await ts.RunTestAsync(this.textBox1);
        }

TestRunner.cs
        public async Task RunTestAsync(TextBox txtBox)
        {
            ExecuteLongWork("[Single Task] Process A:", 5, 590, 1000, txtBox); // これは一応の動作確認用なのでSingle Taskのままにしています
            ExecuteLongWork("[Single Task] Process B:", 6, 690, 1000, txtBox); // Process AとBをシリアルで実行させ、次にProcess C-Gを同時実行

            var taskList = new List<Task<string>>();

            taskList.Add(ExecuteLongWorkAsync("[Multi Task] Process C:", 2, 990, 3000, txtBox));
            taskList.Add(ExecuteLongWorkAsync("[Multi Task] Process D:", 3, 520, 8000, txtBox));
            taskList.Add(ExecuteLongWorkAsync("[Multi Task] Process E:", 3, 800, 1000, txtBox));
            taskList.Add(ExecuteLongWorkAsync("[Multi Task] Process F:", 3, 600, 6000, txtBox));
            taskList.Add(ExecuteLongWorkAsync("[Multi Task] Process G:", 2, 200, 6000, txtBox));

            await Task.WhenAll(taskList.ToArray());
            
        }

DoLongTimeWorkers.cs
        public string DoLongTimeWork(string processName, int repeatTime, int intervalTime, int stableTime, TextBox txtBox)
        {
            string result;
            for (int i = 1; i <= repeatTime; i++)
            {
                txtBox.Parent.Invoke(new Action(() => 
                    {
                        txtBox.Text = txtBox.Text + Environment.NewLine + $"{processName} {i}/{repeatTime} ===== ";
                    }
                ));
                Thread.Sleep(intervalTime);
                
            }
            Thread.Sleep(stableTime);

            result = "Completed";
            return result;
        }

解決済み
編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Re[1]: async/awaitのWaitAllの挙動について /Hongliang 返信無し
 
上記関連ツリー

async/awaitのWaitAllの挙動について / ぱっくん (20/02/09(Sun) 15:33) #93833
Re[1]: async/awaitのWaitAllの挙動について / Hongliang (20/02/09(Sun) 21:38) #93834
  └ async/awaitのWaitAllの挙動について / ぱっくん (20/02/10(Mon) 13:48) #93845 解決済み ←Now

上記ツリーを一括表示 / 上記ツリーをトピック表示
 
上記の記事へ返信