- ベストアンサー
C#のスレッド動作について
- C#のスレッド動作についての問題点を解説します。
- スレッドの中で永久ループさせるテストプログラムでの問題点について考察します。
- InvokeやBeginInvokeを使用したスレッドの並列処理に関する問題点を説明します。
- みんなの回答 (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)
- Yune-Kichi
- ベストアンサー率74% (465/626)
基本的に,Invokeは ・元のスレッドをブロックする ・UIスレッドがアイドル状態になったタイミングでデリゲートを実行する ・UIスレッドでのデリゲートの実行が終了した時点で元のスレッドを再開する という動作になります。 ※1を削除すると,ワーカースレッド側で常にInvokeを呼び出すため, メッセージに応答はしているものの常にInvokeで呼ばれたメソッドを実行している状態に近くなり, UIの応答が極端に悪くなります。 ※1によるSleepは,UIスレッドでの実行間隔を調整することになるため,応答性がよくなる効果をもたらします。 ※2はやってはいけません。 Application.DoEvents自体,根本的に使うべきでは無いですし,UIスレッドで使うべき物です。 ※3もやってはいけません。 UIスレッドをブロックします。 InvokeのかわりにBeginInvokeを使った場合,元のスレッドをブロックしなくなります。 ※1が無い場合,全体として悪化することになります。 これは,ブロックされなくなった結果,UIスレッドにBeginInvokeのリクエストが溜まっていく結果になるためです。
お礼
ご丁寧な回答をいただき、有り難うございました。 もっと詳しく勉強したいのですが、お教え頂いたことを解説しているURLか書籍を御存知でしたら紹介して頂けないでしょうか。