問題タブ [invoke]
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.
c# - Control を拡張して、一貫して安全な Invoke/BeginInvoke 機能を提供することは適切ですか?
winform のクロススレッド更新規則にひどく違反していた古いアプリケーションのメンテナンス中に、不正な呼び出しを発見したときにすばやく修正する方法として、次の拡張メソッドを作成しました。
使用例:
クロージャを活用して読み取る方法も気に入っていますが、その場合は forceSynchronous を true にする必要があります。
レガシー コードの不正な呼び出しを修正するためのこのメソッドの有用性については疑問ではありませんが、新しいコードについてはどうでしょうか。
UI を更新しようとしているスレッドがわからない場合に、このメソッドを使用して新しいソフトウェアの UI を更新するのは良い設計ですか? または、新しい Winforms コードには通常、適切なInvoke()
関連の配管を備えた特定の専用メソッドが含まれている必要があります。そのようなすべてのUIの更新?(もちろん、BackgroundWorker など、他の適切なバックグラウンド処理手法を最初に使用しようとします。)
興味深いことに、これはToolStripItemsでは機能しません。最近、それらがControlではなくComponentから直接派生していることを発見しました。代わりに、包含の呼び出しを使用する必要があります。ToolStrip
コメントへのフォローアップ:
一部のコメントは、次のことを示唆しています。
次のようにする必要があります。
次のmsdn ドキュメントを検討してください。
つまり、InvokeRequired は 、Invoke が必要でない (呼び出しが同じスレッドで発生する)場合、またはコントロールが別のスレッドで作成されたが、コントロールのハンドルがまだ作成されていない場合に、 false を返すことができます。
コントロールのハンドルがまだ作成されていない場合は、コントロールのプロパティ、メソッド、またはイベントを単純に呼び出すべきではありません。これにより、コントロールのハンドルがバックグラウンド スレッドで作成され、メッセージ ポンプのないスレッドでコントロールが分離され、アプリケーションが不安定になる可能性があります。
バックグラウンド スレッドで InvokeRequired が false を返したときに IsHandleCreated の値も確認することで、このケースを防ぐことができます。
コントロールが別のスレッドで作成されたが、コントロールのハンドルがまだ作成されていない場合は、 InvokeRequired
false を返します。これは、 if InvokeRequired
returns true
,IsHandleCreated
が常に true になることを意味します。再度テストすることは冗長であり、正しくありません。
c# - C#の別のスレッドからInvokeを使用してクラスメンバーにアクセスする
注:シリーズの一部:C#:別のクラスのフォームメンバーへのアクセスとC#の別のcsファイルからフォームオブジェクトにアクセスする方法。
こんにちは、
アイデアは、TCPクライアントでパケットが送受信されたときにメモを使用してユーザーに通知することです。
いくつかの修正の後、最も適切な解決策はこれであるように思われました
それが呼ばれている方法です
ただし、安全でないスレッド呼び出しのため、コードを呼び出すと例外がスローされます。msdnで解決策を見つけましたが、そこで使用したメソッドを取得できないようです。
これは私のリメイクですが、機能しません。
エラー:
引数「1」:「メソッドグループ」から「System.Delegate」に変換できません
引数「2」:「文字列」から「オブジェクト[]」に変換できません
基本的に、Invokeを使用して別のスレッドからメモにアクセスしようとしています(または、おそらくメモにテキストを追加しようとしています)。これまで使用したことがないので、間違いを誤解している可能性があります。
.net - TopMost と Invoke を含む Z オーダーの問題
Form.ShowDialog() でダイアログを表示しています。フォームは TopMost に設定されています。一部の画像処理計算は、バックグラウンドで非同期に実行されます。それらの結果は、Invoke によってメイン フォームにレンダリングされます。ここまでは順調ですね。奇妙なことは、時々モーダル ダイアログがメイン フォームの後ろに移動することです。ダイアログを構築するメッセージが Invoke によって何らかの形で「邪魔された」場合に発生すると思います。
この問題を解決する方法はありますか?
c# - Richtextbox.invoke、C#、フォームがまだハングしている
外部プログラムを実行するための ac# アプリケーションを作成し、その出力をフォームのリッチテキスト ボックスにリダイレクトしました。次の設定を使用してプロセスを作成しました
そしてoutputreceivedイベントで
今は機能していますが、アプリケーションからの出力が膨大な場合、テキストボックスを含むメインフォームがハングします。インボーク呼び出しがフォームの再描画につながるたびに、これは非常に頻繁に発生すると思います。テキストボックスの更新が発生したときにそれを確認し、フォームを完全にアクティブに保つための代替手段はありますか?
アップデート:
私は自分の答えを得たと思いBeginInvoke
ますInvoke
。
更新 1:
BeginInvoke と Suspendlayout の両方を試しましたが、必要な機能が得られません。プロセスがすべての標準出力を文字列に戻したのですが、テキストの更新を担当するスレッドがデータを出力するのに時間がかかっています。 . 何かできることはありますか?
c# - C# 複数のパラメーターを指定して呼び出す方法
以下のコードを使用してフォームのプロパティにアクセスしますが、今日はより多くのパラメーターが必要な ListView に書き込みたいと思います。
複数のパラメータを追加する方法とそれらを使用する方法(値、値)?
c# - InvokeRequired に関係なく、Invoke を呼び出すことの何が問題になっていますか?
ここで説明されているように、GUI コントロールへのクロススレッド アクセスの一般的なセットアップを見てきました 。
私が見つけたすべての Web ヒットは、同様のことを説明しています。
しかし、なぜ InvokeRequired を確認する必要があるのでしょうか。Invoke を直接呼び出すことはできませんか?
答えはノーだと思いますので、私の本当の質問は「なぜ」ですか?
c# - 今後のイベントの処理を停止するにはどうすればよいですか
KeyPress イベントと同様に、イベントをサブスクライブする人は誰でも、EventArgs クラスで e.Handled を設定できるようにしたいと考えています。それらが true を返した場合、イベントの発生を継続したくありません。これを実装する方法はありますか?今、ここに私の方法があります:
私の理解では、イベントにサブスクライブしているすべての人が通知を受け取るので、e.Handled = true; を設定します。ここでは効果がありません。