|
分類:[C#]
ロックとGUIスレッド
引き続きC#勉強中です。
ロックと割り込みについて疑問が出てきましたので質問させてください。
下記コードでタスク内a1()実施中にボタンイベントを実施してみたところ、
a4()まで抜けてイベントの処理が行われました。
次にTask_Proc()内のSleepをコメント解除して同様の動作を行ってみたのですが
a2()が実施されました。
これは、GUIスレッドはLockに影響しないということなのでしょうか?
(最初の実行でa1()からa4()まで実施されたのは割り込む隙がなかったから?)
よろしければご教示頂けると助かります。
// タスク
private void Task_Proc()
{
while (true)
{
System.Threading.Thread.Sleep(1000);
System.Diagnostics.Debug.WriteLine(">>> loop1");
lock (lockTest)
{
this.Invoke((MethodInvoker)(() => a1()));
//System.Threading.Thread.Sleep(1000);
this.Invoke((MethodInvoker)(() => a2()));
//System.Threading.Thread.Sleep(1000);
this.Invoke((MethodInvoker)(() => a3()));
//System.Threading.Thread.Sleep(1000);
this.Invoke((MethodInvoker)(() => a4()));
}
}
}
// タスク実行
Task task = Task.Run(() => {
Task_Proc();
});
// イベント
private void btn_Click(object sender, EventArgs e)
{
int i = 0;
while (true)
{
System.Diagnostics.Debug.WriteLine(">>> loop count = {0}", i);
i++;
if (i > 10)
{
return;
}
}
}
private void a1()
{
Lbl_Status.Text = "Invoke実施A";
System.Threading.Thread.Sleep(3000);
}
private void a2()
{
Lbl_Status.Text = "Invoke実施B";
System.Threading.Thread.Sleep(3000);
}
private void a3()
{
Lbl_Status.Text = "Invoke実施C";
System.Threading.Thread.Sleep(3000);
}
private void a4()
{
Lbl_Status.Text = "Invoke実施D";
System.Threading.Thread.Sleep(3000);
}
|