|
分類:[C#]
C#勉強中です。 タスクの動作で疑問点が出てきまして、色々調べてみたのですが いまいち納得できる理由がわかりませんでしたので質問させてください。
下記、Task_Proc()を動作中、ボタンイベントを実施し、それぞれが UpdateText()を呼び出す動作をします。 この際、ボタンイベント後、Invokeが実施されなくなりました。 コードにはありませんが、ボタンイベントを抜けるようにすると Task_Proc()がまだ動作し始めました。 なぜ非同期で交互に動いてくれないのでしょうか? ちなみにラベルの操作を行わないようにすると非同期動作しました。
ボタンイベントが優先度が高くて、終わるまで占有される? それにしてはラベル操作がないと同時に動いているようにみえました。
同時に更新を行うようにするにはどのように処理すればよいのでしょうか?
よろしければ助言いただけると助かります。
// タスク private void Task_Proc() { while (true) { System.Threading.Thread.Sleep(1000); System.Diagnostics.Debug.WriteLine(">>> loop1"); UpdateText(); } }
// タスク実行 Task task = Task.Run(() => { Task_Proc(); });
// 共通呼び出し private void UpdateText() { if (this.InvokeRequired) { this.Invoke((MethodInvoker)(() => Lbl.Text = "Invoke実施")); return; } else { Lbl.Text = "通常実施"; } }
// イベント private void Ini_Click(object sender, EventArgs e) { while (true) { System.Threading.Thread.Sleep(1000); System.Diagnostics.Debug.WriteLine(">>> loop2"); UpdateText(); } }
|