問題タブ [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.
c# - スレッドプールからのWebBrowserへのアクセス
別のスレッドからWebブラウザの情報にアクセスしようとしています。にアクセスしようとするとbrowser.DocumentTitle
、次のエラーが発生します。
The name DocumentTitle does not exist in the current context
DoWork
またはメソッド内のWebページに正常に移動できますが、クラッシュせずProcessWebPage
に関数にアクセスできません。GetTitle
私はこの部分に何日も一人で取り組んできましたが、それを理解することはできません。
問題のコードは次のとおりです。
ブラウザコード
その他のスレッド
c# - InvokeRequiredおよびToolStripStatusLabel
私のアプリケーションには、すべてのデータベースアクションを担当するクラスがあります。これはメインクラスから呼び出され、アクションの完了後にデリゲートを使用してメソッドを呼び出します。非同期であるため、GUIでinvokeを使用する必要があるため、単純な拡張メソッドを作成しました。
これは、textBoxで呼び出そうとすると正常に機能します。
しかし、ToolStripStatusLabelまたはToolStripProgressBarで呼び出そうとすると、エラーが発生します。
タイプ'System.Windows.Forms.ToolStripStatusLabel'は、ジェネリック型またはメソッド'SimpleApp.Helpers.InvokeIfRequired(T、System.Action)'のタイプパラメーター'T'として使用できません。'System.Windows.Forms.ToolStripStatusLabel'から'System.Windows.Forms.Control'への暗黙の参照変換はありません。
これはおそらく簡単な修正であることを私は知っていますが、私はそれを処理することができます:/
vb.net - プログレスバーとコードの場所 (vb.net) のマルチスレッド?
別のスレッドからプログレスバーを更新するのに行き詰まっています。最も簡単な方法で実行できましたが、コードをクリーンアップすると行き詰まります。
私のテスト コードは、backgroundworker と BeginInvoke に関連する Web 上のすべての例のように見えます。
FormP はプログレスバー フォームです。これは機能します:
FormP にカプセル化されたものをより整然と動作させようとしても、うまくいきません。
FormP はフリーズしませんが、UI は更新されません。実際には Me.InvokeRequired は false であり、重要な部分を見逃していると思います。ここで Form1.InvokeRequired を試しましたが、これも false です。私の理解は次のとおりです。ここでの呼び出しスレッドは、このスレッドが呼び出すコードのクラスに関係なく、bgw スレッドです...それはそうではないようです?
ご意見ありがとうございます。
silverlight - シルバーライトでinvokeRequired?
SilverLightには、Winformsと同等のものがありControl.InvokeRequired
ますか?
Winforms Invokeはと同等であることがすでにわかりましたControl.Dispatcher.BeginInvoke
が、次のようなものは見つかりません。InvokeRequired
vb.net - VB - 別のスレッド (シリアル オブジェクト) で実行されているクラスからデータにアクセスする方法
シリアル オブジェクトを使用して Arduino からいくつかの値を取得する Field というクラスを作成しています。クラスによって発生するイベントがあり (データがシリアル ポートから多かれ少なかれ受信されたとき)、それが発生したときに、このクラスからデータを取得する必要があります。以下のコードは機能しますが、必要な方法で機能していないようです。スレッドがどのように機能するかについての私の知識はほとんどありません。シリアルポートオブジェクトが独自のスレッドで実行されるため、それを操作するのが非常に苦痛になることを知っているだけです。
これらの「InvokeRequired」If-Then 条件を使用せずに、この別のスレッドで動作するデータに簡単にアクセスする方法はありますか? この場合にスレッドがどのように機能するかについての詳細情報も素晴らしいでしょう。
c# - まだ別の呼び出しは必要ありません(+バックグラウンドワーカー)
iveはスタックオーバーフローでrevokerequired関連の投稿を高低で検索しました..それは私が多くを学ぶのに役立ちました..しかし私はいくつかの質問があります..invokerequiredだけでなくバックグラウンドワーカーにも関連しています..我慢してください.. :)
私のアプリケーションは何か長いことをし、その過程でGUIを更新する必要があります(プログレスバー、ステータスバー、テキストボックス)。スレッドを使用しましたが、UIを更新するときに恐ろしいクロススレッド例外が発生しました。最近(ちょっと) invokerequiredを適切に使用するコツをつかんだ..[ InvokeRequiredコードパターンの自動化]..この投稿で使用されているコードは次のとおりです。
これが私が気付いたものです..this.InvokeIfRequiredとbutton1.InvokeIfRequiredはどちらも同じことをします..なぜそうなのですか?button1.InvokeIfRequiredのTextがbutton1のtextプロパティに対応することを期待していましたが、代わりに親フォームを参照しています。私には、これはばかげて、直感的でなく、間違っているように見えます。
別の質問..当時、invokerequiredのコツがわからなかったので、バックグラウンドワーカーを使用してGUIを更新するためにprogressイベントを使用しました。
これまでのところ、問題は発生していません。これら2つのアプローチのどちらが優れているか知りたいですか?なぜ?また、以前のInvokeIfRequired関数にデータを渡す方法はありますか?
ありがとう..=)
編集01:親フォームとターゲットコントロールにInvokeを使用することに違いはありますか?..はいform.invokeとcontrol.invokeは同じです..しかし、なぜそうする必要がありますか?直感的ではなく、間違った印象を与えます。
c# - 複数のバックグラウンド スレッドからのラベルの更新
私はサッカーシミュレーターに取り組んでおり、別のスレッドで背景に9つの試合があります。そして、各スレッドの中心にあるメソッドには、イベントがあります。そして、それが発生した場合 (ゴールが「キック」された場合)、フォームのラベル (goalLabel という名前) を部分的な結果で更新したいと考えています。私はコードを書きました...:
...各試合でゴールの正確な数は 6 (結果は 3 - 3) になるため、9 (9 も修正) のバックグラウンド マッチでは、goalLabel はテキスト (6*9=) を変更する必要があります。 54回。ただし、数回しか変更されません。イベントの eventhandler メソッドは次のとおりです。
そして UpdateGoalLabel メソッド:
だから私はラベルのテキストに到達して変更することができますが、54回変更されない理由はわかりません. そして、それが目標であり、すべての目標の後に通知を受け取ることです。
何か案が?
前もって感謝します。
更新 #1: VS2010 を使用しています。
スレッドを起動するコードは次のとおりです。
更新 #2: イベント ハンドラをアタッチする場所は次のとおりです (これは同じメソッドで、前のコード ブロックの数行上にあります)。
そして、これらの Team 配列を Match オブジェクトに変換します。このクラスには 2 つの Team フィールドがあり、イベントと、最初のコード ブロック (のみ) を含むメソッドである PlayMatch メソッドがあるからです。
vb.net - メソッドが呼び出されたとき、またはクロススレッドで呼び出されたときに MainForm の値のコピーが作成されるのはなぜですか?
更新: MainForm のウィンドウ ハンドルの遅延インスタンス化と関係があると思いますが、ここで見られる動作がどのように発生するかを完全に理解することはできませんでした。
アプリケーションは、結果を処理するためのコールバックを提供するサードパーティの COM インターフェイスを介してデータを要求します。コールバックでは、UI を更新する必要がありますが、更新が期待どおりに機能しません。MainForm.DataReady
クロス スレッドで直接呼び出されるか呼び出されると、MainForm の値のコピーが作成されたかのようになりますが、イベント ハンドラーから実行されると、UI の更新は期待どおりに機能します。理由を説明できますか?
(注: MainForm または ClassB で検査されるかどうかAppDomain.CurrentDomain.Id
は常にです。)1
初期コード- MainForm で InvokeRequred /Delegate /Invoke ロジックを使用せずに、ClassB インスタンスから DataReady を呼び出します。アプリケーション UI の変更は期待どおりに機能し、MainFormSomeListControl.EmptyListMsg = "Not Available"
の変更は「定着」しません (あたかも MainForm の別のコピーに適用されたかのように)。
InvokeRequred ロジックを DataReady に追加しましたが、引き続き ClassB から直接呼び出されます。InvokeRequired が true になることはありません。アプリケーション UI の変更は期待どおりに機能し、MainFormSomeListControl.EmptyListMsg = "Not Available"
の変更は「固定」されません (MainForm の別のコピーに適用されたかのように)。
MainForm.DataReady
ClassB から直接呼び出された例外が発生しました:「ウィンドウ ハンドルが作成されるまで、Invoke または BeginInvoke をコントロールで呼び出すことはできません。」ウィンドウハンドルの作成を強制するまで。次に、以前と同じ動作です。つまり、InvokeRequired が true になることはなく、アプリケーション UI の変更は期待どおりに機能し、MainFormSomeListControl.EmptyListMsg = "Not Available"
の変更は「固定」されません (MainForm の別のコピーに適用されたかのように)。
イベント ハンドラから実行ClassA および ClassB で定義されたカスタム 'データ取得' イベント。ClassA は ClassB.got_data_event をリッスンして ClassA.got_data_event を発生させます。MainForm は ClassA.got_data_event をリッスンし、DataReady() を呼び出して処理します。これは機能します - InvokeRequired が true で、Invoke が実行され、アプリケーション UI と MainForm UI の変更が意図したとおりに機能します。
invokerequired - メインスレッドで InvokeRequired=true?
WinForm コントロールをデバッグしていますが、メイン スレッドにいるにもかかわらず InvokeRequired = true を返します。コントロールが非 UI スレッドの子になることは可能ですか? UIコンポーネントであるコントロールはUIスレッドの子にしかならないと思っていました。
c# - InvokeRequired と BeginInvoke に相当するもの
Windowsフォームにこの機能があり、作業をWPFに転送しようとしています。転送後、WPFでサポートされていないInvokeRequired
ことに気付きました。BeginInvoke
関数を WPF に変換する正しい方法を探しています。
メインクラスのスレッドループは次のとおりです。