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

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

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

Re[3]: ロックとGUIスレッド


(過去ログ 167 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■96650 / inTopicNo.1)  ロックとGUIスレッド
  
□投稿者/ まりも (5回)-(2021/01/05(Tue) 15:39:57)

分類:[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);
}

引用返信 編集キー/
■96651 / inTopicNo.2)  Re[1]: ロックとGUIスレッド
□投稿者/ まりも (6回)-(2021/01/05(Tue) 15:50:03)
すみません。Lockを勘違いしていたみたいです。
Lock中は別のスレッドでロックできないだけというだけですかね・・

引用返信 編集キー/
■96655 / inTopicNo.3)  Re[2]: ロックとGUIスレッド
□投稿者/ ぶなっぷ (264回)-(2021/01/05(Tue) 16:33:43)
ロック対象は、同一lockオブジェクトを所有するスレッド間です。
今回の例なら、
  lock (lockTest)
  {
  }
ですので、lockTestオブジェクトでロックを取得しているスレッド間のみ 
{}内の処理の割り込みが起きません。

GUIスレッドはlockTestオブジェクトでロックしているわけではないでしょ。
だから、{}内の処理中でも、いくらでもスレッドスイッチします。

引用返信 編集キー/
■96657 / inTopicNo.4)  Re[3]: ロックとGUIスレッド
□投稿者/ まりも (7回)-(2021/01/05(Tue) 17:58:16)
ありがとうございます。
なんとなくLock中は他から割り込まれないとか考えていました。

解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -