問題タブ [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.

0 投票する
1 に答える
238 参照

.net - 常に Form.Invoke() を使用するのは悪い習慣ですか?

これは非常に簡単な質問かもしれませんが、確信が持てませんでした。モジュールにこれがあります:

そして、これは Form1 という名前のメイン フォームで:

他にも多くのクラス、モジュール、スレッドがあり、を使用せずInvokeRequiredに、どこからでもデリゲートを呼び出すためにこれを使用しています。つまり、他のスレッド、クラス、モジュールなどから..

それ以外の:

それは悪い習慣ですか?InvokeRequired毎回チェックする目的は本当にありますか?

0 投票する
2 に答える
299 参照

.net - .NET 呼び出しプロセス フロー

私は常にコードの何らかの形式またはファッションを見たり使用したりしています。

私の質問は... を使用すると、GUI スレッドはどうなりInvokeますか? スレッドがすぐに実行される割り込みのようなものmethod1ですか?

0 投票する
2 に答える
1234 参照

c# - クロススレッド InvalidOperationException, InvokeRequired == false 2スレッド同時アクセス時

コントロールは 2 つのワーカー スレッドによってアクセスされます。最初のスレッドがコントロールでの作業を完了する前に 2 番目のスレッドがアクセスされます。2 番目のスレッド (9) は InvokeRequired == false を取得し、最初のスレッド (17) は子コントロールで .Refresh を呼び出すときに例外を取得します。

これは予想される動作ですか?スレッドがコントロールの InvokeRequired を true/false と見なす正確な原因は何ですか?
そして最後に、良い解決策は何でしょうか..すべてのinvokeステートメントをロックし、代わりに別のメソッドを呼び出すようにします(明らかにデッドロックを回避するため)?

出力:

0 投票する
4 に答える
55092 参照

c# - InvokeRequired in wpf

アプリケーションでこの関数を使用しましたWindows forms

しかし、それではWPF機能しません。なんで?

0 投票する
1 に答える
75 参照

multithreading - Windowsフォームスレッドを呼び出してスリープ状態にする

マネージC++アプリケーションがあり、新しいスレッドを開始していくつかの処理を実行し、いくつかのテキストボックスを更新します。このアプリケーションはループし、すべてのループの最後でスリープします。スリープ状態のため、UIがクラッシュしないように、新しいスレッドに配置する必要がありました。次に、UIを作成したスレッドを呼び出してテキストボックスにアクセスする必要があることに気付きましたが、メインスレッドに戻ったため、スリープ状態でクラッシュしました。これにどのようにアプローチすればよいですか。

0 投票する
1 に答える
94 参照

vb.net - INVOKEの置き換え方法

他のスレッドで作成されたオブジェクトにInvokeandメソッドを使用する方法はありますか? InvokeRequiredより直接的でメモリ消費の少ない方法はありますか? おそらく、ステート マシンまたはスレッド コントロールでしょうか。

このメソッドのリソース使用量について心配するのは時間の無駄ですか?

私はこの呼び出し方法を使用しています: http://tech.xster.net/tips/invoke-ui-changes-across-threads-on-vb-net/

VS 2012 で VB.NET を使用しています

0 投票する
1 に答える
134 参照

c# - 「Invoke」と「BeginInvoke」が呼び出されますが、解決されません

ソフトウェアの GUI スレッドを担当しています。基になる API から常にポーリングする必要がある GridView データ内に表示する必要があります。データを更新するというメソッドを作成し、and/orSync()を使用してスレッド セーフにしようとしました。このメソッドは、約 5 秒ごとにタイマーによって呼び出されます。BeginInvokeInvokeSync

の本体がSync呼び出されることはありません。何らかの理由で、私の要求がメッセージ ポンプから取り出されないように見えるからです。コード:

ログは次のようになります。

他のメッセージは印刷されません。

についても同じですBeginInvoke。「End Invoke ...」は出力されますが、「inside body ...」は出力されません。

Unity3D と MonoDevelop の上で実行しています (これで何かが変わる場合)。

0 投票する
2 に答える
4110 参照

c# - 呼び出された後に 2 回実行されるメソッド

解決できない「呼び出し」の問題があります。できる限り詳しく説明するように努めますが、私はこれに慣れていないので、ご容赦ください。さらに情報が必要な場合はお知らせください。

プロンプトが表示されたときに、メイン スレッドで作成されたフォームの一連のチェック ボックスを無効にするバックグラウンド スレッドが実行されています。これを行うにはinvoke、デリゲートを使用して安全にクロススレッドする必要がありますが、それは間違っているに違いありません。要するに、デバッガーでこれをチェックすると、コードの ACTION 部分が 2 回実行されることがわかりますInvokeRequired。ACTION を , で囲むことでこれを回避できます。2回else実行されることはありませんがelse、メソッドをもう一度実行しようとします。

メソッドを2回実行する理由を知りたいだけです。さらに情報が必要な場合はお知らせください。喜んで共有させていただきます。

0 投票する
2 に答える
1220 参照

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 が私よりも経験豊富な多くのプログラマーによって過剰に使用されているように見えるのか、興味があります。