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

わんくま同盟

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

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


■96009 / )  Re[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();
            }
        }
    }

返信 編集キー/


管理者用

- Child Tree -