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

わんくま同盟

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

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

ツリー一括表示

ロックとGUIスレッド /まりも (21/01/05(Tue) 15:39) #96650
Re[1]: ロックとGUIスレッド /まりも (21/01/05(Tue) 15:50) #96651
  └ Re[2]: ロックとGUIスレッド /ぶなっぷ (21/01/05(Tue) 16:33) #96655
    └ Re[3]: ロックとGUIスレッド /まりも (21/01/05(Tue) 17:58) #96657 解決済み


親記事 / ▼[ 96651 ]
■96650 / 親階層)  ロックと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);
}

[ □ Tree ] 返信 編集キー/

▲[ 96650 ] / ▼[ 96655 ]
■96651 / 1階層)  Re[1]: ロックとGUIスレッド
□投稿者/ まりも (6回)-(2021/01/05(Tue) 15:50:03)
すみません。Lockを勘違いしていたみたいです。
Lock中は別のスレッドでロックできないだけというだけですかね・・

[ 親 96650 / □ Tree ] 返信 編集キー/

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

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

[ 親 96650 / □ Tree ] 返信 編集キー/

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

解決済み
[ 親 96650 / □ Tree ] 返信 編集キー/


管理者用

- Child Tree -