※ ChatGPTを利用し、要約された質問です(原文:C#のスレッド動作について)
C#のスレッド動作について
下記はスレッドの中で永久ループさせるテストプログラムで、1秒毎にテキストボックス内の数値をインクリメントします。
【問題点1】
※1と※2のコマンドを削除した状態(※3のみ)で正常な動作を期待していたのですが、実際にはフリーズ状態となり、カウント値が表示されません。
※2のApplication.DoEvent()を実装するか、※3の替わりに※1に実装すると正常動作となります。
ExecThread実行中は他の処理を出来なくても、これを抜けた時点で表示処理に移るので表示される筈と思っていたのですが違う様です。
【問題点2】
Invokeの替わりにBeginInvokeを使えばExecThread実行中でも他の処理と並列処理されると思っていたのですが、スレッドを2個用意して試したところInvokeと全く変わらず、やはりフリーズ状態となります。
【問題点3】
ExecThreadを匿名メソッドにすると「フィールド初期化子は、静的でないフィールド、メソッド、又はプロパティ'iCount'を参照できません」のエラーとなり、「iCount」をstatic変数にするとOKになります。
匿名メソッドではインスタンス変数は使えないのでしょうか。
上記3項目についてネットで調べたのですがその様な記述は見当たりませんでした。
何か使い方が間違っているのでしょうか?
間違い点など、ご指摘頂ければ有難いです。 どうぞ宜しくお願いします。
private void ExecWorker() ← スレッド
{
while (true)
{
Invoke(new Exec1Delegate(this.ExecThread)); ← BeginInvokeを使っても症状は同じ
iCount++;
Thread.Sleep(1000); ← ※1 このSleepが無いとフリーズする
Application.DoEvent(); ← ※2 これがあると※1のSleepが無くてもOK
}
}
delegate void ExecDelegate();
private void ExecThread()
{
lbThread.Text = iCount.ToString(); ← 匿名メソッドにするとエラーになる
Thread.Sleep(1000); ← ※3 (※1のSleepと同時実装はしない)
}
お礼
ご丁寧な回答をいただき、有り難うございました。 もっと詳しく勉強したいのですが、お教え頂いたことを解説しているURLか書籍を御存知でしたら紹介して頂けないでしょうか。