• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C#のスレッド動作について)

C#のスレッド動作について

このQ&Aのポイント
  • C#のスレッド動作についての問題点を解説します。
  • スレッドの中で永久ループさせるテストプログラムでの問題点について考察します。
  • InvokeやBeginInvokeを使用したスレッドの並列処理に関する問題点を説明します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

WinFormsとマルチスレッドについて詳しく書いてある書籍などを私は知らないのですが……。 とりあえず,「とあるコンサルタントのつぶやき」 ( http://blogs.msdn.com/b/nakama/ ) の一連の記事などは読んでおくとよいと思います。 ・マルチスレッド Windows フォームアプリケーションの開発 http://blogs.msdn.com/b/nakama/archive/2009/03/30/windows.aspx ・Part 1. Windows フォームのマルチスレッド処理の基礎 http://blogs.msdn.com/b/nakama/archive/2009/03/31/part-1-windows.aspx ・タスクスレッドの起動方法 http://blogs.msdn.com/b/nakama/archive/2009/04/02/9521640.aspx ・Part 3. タスクスレッドと UI の協調動作 http://blogs.msdn.com/b/nakama/archive/2009/04/07/part-3-ui.aspx ・Part 4. Visual Studio によるマルチスレッドアプリの開発 http://blogs.msdn.com/b/nakama/archive/2009/04/09/part-4-visual-studio.aspx

その他の回答 (1)

回答No.1

基本的に,Invokeは ・元のスレッドをブロックする ・UIスレッドがアイドル状態になったタイミングでデリゲートを実行する ・UIスレッドでのデリゲートの実行が終了した時点で元のスレッドを再開する という動作になります。 ※1を削除すると,ワーカースレッド側で常にInvokeを呼び出すため, メッセージに応答はしているものの常にInvokeで呼ばれたメソッドを実行している状態に近くなり, UIの応答が極端に悪くなります。 ※1によるSleepは,UIスレッドでの実行間隔を調整することになるため,応答性がよくなる効果をもたらします。 ※2はやってはいけません。 Application.DoEvents自体,根本的に使うべきでは無いですし,UIスレッドで使うべき物です。 ※3もやってはいけません。 UIスレッドをブロックします。 InvokeのかわりにBeginInvokeを使った場合,元のスレッドをブロックしなくなります。 ※1が無い場合,全体として悪化することになります。 これは,ブロックされなくなった結果,UIスレッドにBeginInvokeのリクエストが溜まっていく結果になるためです。

mark225
質問者

お礼

ご丁寧な回答をいただき、有り難うございました。 もっと詳しく勉強したいのですが、お教え頂いたことを解説しているURLか書籍を御存知でしたら紹介して頂けないでしょうか。

関連するQ&A