21

私は初心者のプログラマーなので、ここで完全に誤解される可能性がありますが、この問題は私を必要以上に悩ませます。

これは実際にはこの質問のフォローアップです。

受け入れられた答えは、UI スレッドで既に操作している可能性があるため、オーバーヘッドを回避するために InvokeRequired を呼び出す必要があるというものでした。

理論的には、時間を節約できることに同意します。いくつかのテストの後、Invoke を使用すると、通常の操作を呼び出す場合に比べて約 2 倍の時間がかかることがわかりました (ラベルのテキストを n 回設定する、RichTextBox に非常に大きな文字列を配置するなどのテスト)。

しかし!それから練習があります。

MSDN のドキュメントには次のように記載されています。

このプロパティを使用して、invoke メソッドを呼び出す必要があるかどうかを判断できます。これは、どのスレッドがコントロールを所有しているかがわからない場合に役立ちます。

ほとんどの場合、別のスレッドからコントロールにアクセスしようとするとわかります実際、私が考えることができる唯一の状況は、所有者スレッドだけでなくスレッド X からも呼び出すことができるメソッドからコントロールにアクセスする場合です。そして、それは私にとって非常にありそうもない状況です。

また、どのスレッドがコントロールを操作しようとしているのか本当にわからなくても、UI スレッドをそれほど頻繁に更新する必要がないという事実があります。GUI では、25 ~ 30 fps であれば問題ありません。また、UI コントロールで行われるほとんどの変更は、実行に数ミリ秒もかかりません。

したがって、私が正しく理解している場合、呼び出しが必要かどうかを確認する必要がある唯一のシナリオは、コントロールにアクセスしているスレッドがわからない場合と、GUI の更新が完了するまでに約 40 ミリ秒以上かかる場合です。

次に、 http://programmers.stackexchange.comで尋ねたこの質問に対する回答があります。これは、必要のない時期に時期尚早の最適化で忙しくすべきではないと述べています。特にコードの可読性を犠牲にする場合。

したがって、これは私の質問につながります:別のスレッドがコントロールにアクセスすることがわかっているときにだけ呼び出しを使用すべきではなく UI スレッドがそのコードアクセスできることがわかっていて、より高速に実行する必要があることがわかった場合にのみ、 Invoke が必要かどうかを確認する必要がありますか?

PS:私の質問を校正した後、本当に私が怒鳴っているように聞こえます。しかし実際には、なぜ InvokeRequired が私よりも経験豊富な多くのプログラマーによって過剰に使用されているように見えるのか、興味があります。

4

2 に答える 2