問題タブ [invokerequired]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
.net - 常に Form.Invoke() を使用するのは悪い習慣ですか?
これは非常に簡単な質問かもしれませんが、確信が持てませんでした。モジュールにこれがあります:
そして、これは Form1 という名前のメイン フォームで:
他にも多くのクラス、モジュール、スレッドがあり、を使用せずInvokeRequired
に、どこからでもデリゲートを呼び出すためにこれを使用しています。つまり、他のスレッド、クラス、モジュールなどから..
それ以外の:
それは悪い習慣ですか?InvokeRequired
毎回チェックする目的は本当にありますか?
.net - .NET 呼び出しプロセス フロー
私は常にコードの何らかの形式またはファッションを見たり使用したりしています。
私の質問は... を使用すると、GUI スレッドはどうなりInvoke
ますか? スレッドがすぐに実行される割り込みのようなものmethod1
ですか?
c# - クロススレッド InvalidOperationException, InvokeRequired == false 2スレッド同時アクセス時
コントロールは 2 つのワーカー スレッドによってアクセスされます。最初のスレッドがコントロールでの作業を完了する前に 2 番目のスレッドがアクセスされます。2 番目のスレッド (9) は InvokeRequired == false を取得し、最初のスレッド (17) は子コントロールで .Refresh を呼び出すときに例外を取得します。
これは予想される動作ですか?スレッドがコントロールの InvokeRequired を true/false と見なす正確な原因は何ですか?
そして最後に、良い解決策は何でしょうか..すべてのinvokeステートメントをロックし、代わりに別のメソッドを呼び出すようにします(明らかにデッドロックを回避するため)?
出力:
c# - InvokeRequired in wpf
アプリケーションでこの関数を使用しましたWindows forms
:
しかし、それではWPF
機能しません。なんで?
multithreading - Windowsフォームスレッドを呼び出してスリープ状態にする
マネージC++アプリケーションがあり、新しいスレッドを開始していくつかの処理を実行し、いくつかのテキストボックスを更新します。このアプリケーションはループし、すべてのループの最後でスリープします。スリープ状態のため、UIがクラッシュしないように、新しいスレッドに配置する必要がありました。次に、UIを作成したスレッドを呼び出してテキストボックスにアクセスする必要があることに気付きましたが、メインスレッドに戻ったため、スリープ状態でクラッシュしました。これにどのようにアプローチすればよいですか。
vb.net - INVOKEの置き換え方法
他のスレッドで作成されたオブジェクトにInvoke
andメソッドを使用する方法はありますか? InvokeRequired
より直接的でメモリ消費の少ない方法はありますか? おそらく、ステート マシンまたはスレッド コントロールでしょうか。
このメソッドのリソース使用量について心配するのは時間の無駄ですか?
私はこの呼び出し方法を使用しています: http://tech.xster.net/tips/invoke-ui-changes-across-threads-on-vb-net/
VS 2012 で VB.NET を使用しています
c# - 「Invoke」と「BeginInvoke」が呼び出されますが、解決されません
ソフトウェアの GUI スレッドを担当しています。基になる API から常にポーリングする必要がある GridView データ内に表示する必要があります。データを更新するというメソッドを作成し、and/orSync()
を使用してスレッド セーフにしようとしました。このメソッドは、約 5 秒ごとにタイマーによって呼び出されます。BeginInvoke
Invoke
Sync
の本体がSync
呼び出されることはありません。何らかの理由で、私の要求がメッセージ ポンプから取り出されないように見えるからです。コード:
ログは次のようになります。
他のメッセージは印刷されません。
についても同じですBeginInvoke
。「End Invoke ...」は出力されますが、「inside body ...」は出力されません。
Unity3D と MonoDevelop の上で実行しています (これで何かが変わる場合)。
c# - 呼び出された後に 2 回実行されるメソッド
解決できない「呼び出し」の問題があります。できる限り詳しく説明するように努めますが、私はこれに慣れていないので、ご容赦ください。さらに情報が必要な場合はお知らせください。
プロンプトが表示されたときに、メイン スレッドで作成されたフォームの一連のチェック ボックスを無効にするバックグラウンド スレッドが実行されています。これを行うにはinvoke
、デリゲートを使用して安全にクロススレッドする必要がありますが、それは間違っているに違いありません。要するに、デバッガーでこれをチェックすると、コードの ACTION 部分が 2 回実行されることがわかりますInvokeRequired
。ACTION を , で囲むことでこれを回避できます。2回else
実行されることはありませんがelse
、メソッドをもう一度実行しようとします。
メソッドを2回実行する理由を知りたいだけです。さらに情報が必要な場合はお知らせください。喜んで共有させていただきます。
c# - InvokeRequired をやみくもに使用するのは悪い習慣ではないでしょうか?
私は初心者のプログラマーなので、ここで完全に誤解される可能性がありますが、この問題は私を必要以上に悩ませます。
これは実際にはこの質問のフォローアップです。
受け入れられた答えは、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 が私よりも経験豊富な多くのプログラマーによって過剰に使用されているように見えるのか、興味があります。