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

わんくま同盟

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

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

■96009 / 1階層)  Task起動先が、Task起動元の終了を検知する方法について
□投稿者/ kiku (199回)-(2020/10/15(Thu) 14:58:55)
No96002 (taro さん) に返信
> ■教えてほしいこと
> ・上記の「Form2が存在するかどうかをフラグで判定」という方法はベストではない気がしています。
>  本当は、終了ボタン押下時に「処理タスクを止める」という事をしたかったのですが、やり方が分からず・・・。
>  ベストな実装はどのようなものでしょうか?

ベストではないかもしれませんが、
こんな方法でタスクを止めることができます。

    public partial class Form2 : Form
    {
        private CancellationTokenSource cts;
        private bool TaskEnd = false;

        public Form2()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            // フォームを閉じて上位に返す
            this.DialogResult = DialogResult.OK;
            this.Close();
        }

        private void Form2_Shown(object sender, EventArgs e)
        {
            textBox1.AppendText("UDP通信タスクを起動します" + "\r\n");
            cts = new CancellationTokenSource();
            Task task = Task.Run(() => {
                RunProcTask(cts.Token);
            });
        }

        private void RunProcTask(CancellationToken ct)
        {
            try
            {
                TaskEnd = false;
                while (true)
                {
                    if (ct.IsCancellationRequested) return;
                    //故意にここにスリープを入れた。
                    //これによりここで終了ボタンが押される確率が高くなる
                    Thread.Sleep(1000);
                    Invoke(new Action<string>(this._PutLog), "処理");
                }
            }
            finally
            {
                TaskEnd = true;
            }
        }

        private void _PutLog(string msg)
        {
            textBox1.AppendText(msg + "\r\n");
        }

        private void Form2_FormClosing(object sender, FormClosingEventArgs e)
        {
            cts.Cancel();
            while (TaskEnd == false)
            {
                //これがないとデットロック
                //Invokeを実行できるようにしている
                Application.DoEvents();
            }
        }
    }

編集キー/

前の記事(元になった記事) 次の記事(この記事の返信)
←Task起動先が、Task起動元の終了を検知する方法について /taro →Re[2]: Task起動先が、Task起動元の終了を検知する方法について /furu
 
上記関連ツリー

Task起動先が、Task起動元の終了を検知する方法について / taro (20/10/15(Thu) 10:33) #96002
Re[1]: Task起動先が、Task起動元の終了を検知する方法について / WebSurfer (20/10/15(Thu) 10:51) #96003
Re[1]: Task起動先が、Task起動元の終了を検知する方法について / WebSurfer (20/10/15(Thu) 11:10) #96005
Task起動先が、Task起動元の終了を検知する方法について / kiku (20/10/15(Thu) 14:58) #96009 ←Now
│└ Re[2]: Task起動先が、Task起動元の終了を検知する方法について / furu (20/10/15(Thu) 15:45) #96010
│  └ Re[3]: Task起動先が、Task起動元の終了を検知する方法について / kiku (20/10/15(Thu) 15:48) #96011
│    └ Re[4]: Task起動先が、Task起動元の終了を検知する方法について / furu (20/10/15(Thu) 16:03) #96012
Re[1]: Task起動先が、Task起動元の終了を検知する方法について / WebSurfer (20/10/16(Fri) 11:05) #96016
Re[1]: Task起動先が、Task起動元の終了を検知する方法について / WebSurfer (20/10/21(Wed) 11:50) #96093
  └ Re[2]: Task起動先が、Task起動元の終了を検知する方法について / taro (20/10/23(Fri) 14:40) #96149 解決済み

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