問題タブ [invalidoperationexception]
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# - WPF/C# で複雑なコンテンツを生成して GUI スレッドに渡す
xxx.Dispatcher.Invoke() メソッドを使用してバックグラウンド スレッドを取得し、GUI 要素を操作することを認識しています。私は、オブジェクトのツリーを構築するために長時間実行されるバックグラウンド タスクが必要であり、表示のために GUI に渡す必要がある、似たようなものにぶつかっていると思いますが、わずかに異なります。
これを実行しようとすると、「別のスレッドがこのオブジェクトを所有しているため、呼び出し元のスレッドがこのオブジェクトにアクセスできないため」、InvalidOperationException が発生します。不思議なことに、これは単純型では起こりません。
例外をスローする単純なケースを示すコード例を次に示します。これを回避する方法はありますか?バックグラウンド スレッドがファクトリで構築されたオブジェクトを所有しており、フォアグラウンド GUI スレッドが所有権を取得できないことが問題であると確信していますが、より単純なシステム タイプでは機能します。
問題の範囲は、バックグラウンドでオンザフライで構築している大きなドキュメントがあり、完了を待たずにこれまでに生成されたものを GUI に表示したいということです。
バックグラウンド ワーカーがオブジェクト ファクトリとして機能し、コンテンツをメイン スレッドに渡すにはどうすればよいでしょうか。
ありがとう!
wcf - WCF無効な操作の例外
L2SQL DAL とともに wcf サービスを使用しているときに、この奇妙な問題が発生します。サーバーは localhost でホストされ、対応するインターフェイスの実装が含まれています。クライアントはインターフェイスに精通しており、tcp トランスポートを使用して公開されたサービスを介してデータベースにクエリを実行することがあります。クライアントがローカルで実行されている場合、すべて問題ありません。ただし、クライアントが別のマシンで実行されるたびに、「InvalidOperationException」が System.Data.dll でスローされ (トランスポートは引き続き配信されます)、チャネルが「障害」状態になります (そして、トランスポートは配信されません)。アプリケーションに非常に基本的なものが欠けているように感じます。そのような奇妙な行動の考えられる理由を誰か指摘してもらえますか?
c# - このエラーがキャッチされないのはなぜですか?
私のプロジェクトには次のコードがあります。
try catch は、グリッドビューを含むポップアップ フォームが無効な操作の例外を発生させることがあるからです。これは推奨される回避策です。
以前、deleteSelector で Show を使用しましたが、回避策は完全に機能しました。現在、showdialog を使用すると、エラーがキャッチされなくなったようです (キャッチされていないエラー メッセージが表示されます)。エラーがキャッチされないのはなぜですか?
.net - ソケット/スレッドの問題: 元に戻す操作で、対応するセット操作で適用されたものとは異なるコンテキストが検出されました
上記のよくあるエラーに問題があります。数年間正常に動作している TCP/IP サーバー アプリケーションがあります。次に、ソケット接続を内部的に使用してサーバー アプリケーション内の localhost (127.0.0.1) にパッチを適用することにより、アプリケーションが直接接続された USB デバイスからの接続を受け入れるようにする必要があります。(ところで、私がこれを行っている理由を説明するためだけに USB について言及します。この問題のデバッグの一環として、すべての USB 機能を無効にしました)。
このソケットに沿った通信により、クライアント側とサーバー側の両方で GUI 要素が呼び出される可能性があります。クライアント側で GUI 要素にアクセスすると、タイトルにエラーが発生します (以下のコール スタック)。ここでの重要な問題の 1 つは、デバッガーが例外で停止できないことです。すべての例外がスローされたときに停止するように設定されているにもかかわらず、エラーが発生すると、アプリケーションは単純に終了します。
私のアプリケーションの唯一の特徴は、内部ソケットを使用して 127.0.0.1 に接続していることです。また、クライアントを別のアプリケーションに分離した場合、アプリケーションが正常に動作することも確認しています。ただし、他の理由により、これを永続的な解決策として使用することはできません。
この種の問題について議論している投稿がいくつかあります。それらを以下にリストします。残念ながら、私の場合、解決策を提供するものはないようです:
- ほとんどの関連記事では、Invoke または BeginInvoke を使用して、すべての GUI 操作が GUI スレッドで実行されるようにする必要性について説明しています。私のアプリケーションはこれを正しく行い (Application.Forms を使用してフォームを取得し、メイン フォームを取得し、これに対して Invoke を呼び出します)、デバッガーでダブル チェックしたと確信しています。
- 上記に関連して、ブロックする/ブロックしないための Invoke と BeginInvoke の使用に関するいくつかの議論があります。私の場合、どちらも同じ結果になります。
- 一部の投稿では、GUI スレッドでソケット自体を作成する必要があることが示唆されています (私の場合)。
- これは、アプリケーションで DoEvents を使用するとエラーが発生する可能性があることを説明しています (私は使用しません)。
- これは、クライアント ソケット接続に非同期呼び出しを使用している場合 (私のクライアント接続は同期)、EndConnect 呼び出しが見つからないというエラーが発生する可能性があることも意味します。
- これは、ウィンドウ ハンドルがまだ作成されていない場合に InvokeRequired から誤った結果が得られる可能性があることを説明しています (これは IsHandleCreated で確認済みです)。
- これは microsoft connectで同様のバグを報告していますが、解決策はありません (microsoft は 2006 年から「調査」しています!)
- これには、AsyncOperationManager.SynchronizationContext を使用して同期コンテキストをバックアップ/復元するという提案が含まれていますが、これは (当然のことですが?) さまざまなエラーを引き起こすだけです。
- エラーがデバッグのみであることを示唆する投稿がいくつかありますが、次のようにすれば解消されますが、それを試してみることはありませんでした:
System.Windows.Forms.Form.CheckForIllegalCrossThreadCalls = false
同様の質問をしている他の投稿があります: here、here、およびhere。ここもいいもの。
以下にコード スニペットを示します。クライアントがソケット データを受信すると、ProcessCommandCT 内でクラッシュが発生します。
.NET4 で VB .NET 2010 を使用しています。
助けてくれてありがとう - 上記の投稿の統合リストが他の人にも役立つことを願っています.
ティム
コール スタック:
wpf - ハイライト検索 TextBlock
私の目標は、新しい依存関係プロパティ SearchText を持つカスタム TextBlock コントロールを作成することです。このプロパティには正規表現が含まれます。TextBlock のテキスト内のこの正規表現のすべての出現箇所は、カスタム スタイル (別の DP) を使用して強調表示されます。
私の現在の実装では、TextBlock の InlineCollection 内のすべての Inline オブジェクトをクリアしています。次に、ハイライトされていないテキストのランとハイライトされたテキストのランで TextBlock を塗りつぶします (この方法では、TextBlock に直接インラインを追加することはできません。代わりに、TextBlock.TextProperty を使用する必要があります)。
うまく機能しますが、インラインをクリアしようとすると、奇妙な例外が発生することがあります。
この問題はこれに関連しているようです。TextChanged 関数でインラインを変更していますが、無限再帰編集を避けるためにフラグを使用しています。
このカスタム コントロールを設計する方法について何か考えはありますか? これを行うより良い方法はありますか?この例外を回避するにはどうすればよいですか?
ありがとう!
c# - マルチスレッド WPF アプリで LinearGradientBrush を作成するときの InvalidOperationException
static
C#のメソッドで を実行var brush = new LinearGradientBrush(_snazzyGradient);
すると、この行で例外がスローされます。 _snazzyGradient
は次のように定義されます。
method と_snazzyGradient
implementsの両方を含むクラスINotifyPropertyChanged
(重要な場合) であり、ビュー モデルとして使用されます。を使用する静的メソッドは_snazzyGradient
、クラスのコンストラクターで呼び出されます。を参照するコンストラクターを使用して、UserControl
クラス内で依存関係プロパティの値をそのビュー モデル クラスの新しいインスタンスに設定します_snazzyGradient
。
アプリをデバッグしているときに、var brush = new LinearGradientBrush(_snazzyGradient);
行で次の例外が発生します。
System.InvalidOperationException がキャッチされました Message=別のスレッドがこのオブジェクトを所有しているため、呼び出しスレッドはこのオブジェクトにアクセスできません。ソース = WindowsBase StackTrace: System.Windows.Threading.Dispatcher.VerifyAccess() で System.Windows.Threading.DispatcherObject.VerifyAccess() で System.Windows.Freezable.ReadPreamble() で System.Windows.Media.GradientStopCollection.OnInheritanceContextChangedCore( System.Windows.DependencyObject.OnInheritanceContextChanged(EventArgs args) の System.Windows.DependencyObject.OnInheritanceContextChanged(EventArgs args) System.Windows.Freezable.AddInheritanceContext(DependencyObject コンテキスト、DependencyProperty プロパティ) の System.Windows.DependencyObject.ProvideSelfAsInheritanceContext(DependencyObject doValue、DependencyProperty dp) の System.Windows。依存オブジェクト。
依存関係プロパティをUserControl
次のように変更しました。
私の質問は、どうすればこれを取り除くことができInvalidOperationException
ますか? Dispatcher
ビュー モデルにスレッド関連の呼び出しを大量に配置する必要があるのは正しくないようです。静的フィールドとして定義するのではなく_snazzyGradient
、静的メソッドから返す必要がありますか? それが役立つかどうかはわかりません。必要なファイルの読み取り/書き込み時に GUI が動かなくなるようなことはしたくないので、私は間違いなくマルチスレッド化を望んでいます。おそらく私の問題は、ビューモデルでGradientStop
(inherits from ) などを使用することに起因します。DependencyObject
おそらく、それらは my からビューモデルのコンストラクターに与えられるべきUserControl
ですか?
wpf - WPF アプリケーションのブルー STA スレッド例外から
「呼び出し元のスレッドは STA でなければなりません。多くの UI コンポーネントがこれを必要とするためです。」という例外が発生します。例外を与えているコンストラクターが STA スレッド内から呼び出されているため、これはばかげています!
私は本当に私のロープの終わりにいます。他の誰かがこの問題に遭遇しましたか?
c# - C# - BackgroundWorker は常にコントロールを更新しています: エラー!
私は伝統的に、何らかの理由で C# の BackgroundWorkers に多くの問題を抱えています。彼らのコンセプトは本当に私を困惑させているように見えるので、これがかなり基本的な問題であり、簡単に修正できることを願っています...
.NET リモート処理を使用してやり取りする 2 つのフォームがあります。現在、Form1 の設定を変更すると、Form2 で何かが変更され、うまく機能しています。ただし、今は同じことを別の方法で機能させる必要があり (Form2 で何かを変更すると Form1 が更新されます)、同じ方法では実行できません (設計上の制限により、Form2 に変更を送信させることはできません)。 Form1 に)。現在、Form1 で BackgroundWorker を使用して、各サブコントロール (Form1 に配置されている) で 'Update()' メソッドを常に呼び出そうとしています。これらの各コントロールには、Form2 から同等の設定の現在の状態を取得し、それ自体を更新する手段があります (これはうまく機能します。'Update()' メソッドは Form1 の初期化で動作していることがわかります)。
ここで私の問題が発生します。BackgroundWorker が各フォームで常に「Update()」を呼び出す方法が不明だったので、「DoWork()」メソッドに「while(true)」ループがあり、その中で BackgroundWorker が「Update」を呼び出します。 ()' 各サブコントロールのメソッドを実行し、非常に短い時間スリープしてから繰り返します。
このようにすると、「InvalidOperationException was unhandled by user code」というエラーが表示され、「クロススレッド操作が無効です: コントロール 'comboBox_BGColor' は、作成されたスレッド以外のスレッドからアクセスされました。」これで、基本的にこれが何を意味するのかがわかり、なぜそれが起こったのか理解できましたが、どうすればいいのか、または希望どおりに機能させるために変更する方法がわかりません。これについて、または私が BackgroundWorker を使用している方法についてのヒントはありますか? 情報をありがとう、そしてこれを読むために時間を割いてくれてありがとう!
c# - RhinoMocksを使用して3つの異なるタイプのジェネリックメソッドをAssertWasCalledするにはどうすればよいですか?
Rhino Mocks AAA構文を学習しようとしていますが、特定のメソッド(任意の引数値を使用)が呼び出されたことを表明するのに問題があります。テストフレームワークとしてMachine.Specificationsを使用しています。
この特定のメソッドは一般的であり、3つの異なるタイプで3回呼び出されたことを確認したいと思います。
タイプごとに関数をスタブしました。しかし、私は興味深い結果を得ています。(下)
結果は、2つの例外と1つのパスです。
最初の呼び出しは次のようにスローします。
System.InvalidOperationException:検証する期待値が設定されていません。アクションのメソッド呼び出しが仮想(C#)/オーバーライド可能(VB.Net)メソッド呼び出しであることを確認してください
2番目のものはスローします:
System.InvalidOperationException:記録中のモックメソッド呼び出し内でのみArgを使用してください。1つの引数が必要で、2つが定義されています。
3番目のものは合格します...いくつかの奇妙な理由で。
また、セットアップでExpectでGenerateMock()を使用したり、StubでGenerateStub()を使用したりしました。どちらもまったく同じ結果になりました。私は何か間違ったことをしなければならない。
私が使用しているのは、MachineSpec0.3.0.0とRhinoMocks3.6.0.0です。
何か案は?
- - -修繕 - - - - -
これがリーの助けを借りた完全な(作業バージョン)です。追加の(非linq)レイヤーを使用しています。私の実際の問題は、私のテストの1つがオフラインの実際のコードで間違ったラムダ変数を再利用したことでした。それはShould_do_something=()=> repo.AssertWasCalled(o => repo .Save(data)); //悪いラムダ
したがって、参照用の正しいテストのサンプルを次に示します。
vb.net - VB.net ApplicationFramework と SplashScreen: InvalidOperationException
私は最近、アプリをカスタム SplashScreen の使用からアプリケーション フレームワークに変更しました。
これが私がしたことです:
- アプリのバージョンなどを表示する新しい SplashScreenForm を作成しました。
- そのフォームを選択: My Project -> Application -> SplashScreen
- 長時間実行される初期化コードをメイン フォームのコンストラクターから ApplicationEvents スタートアップ イベントに移動しました。
それは私が望むことを完全に行います。SplashScreen が最初に表示され、Startup イベントが発生して機能します。SplashScreen が閉じ、実際のメイン フォームが表示されます。
ここまでは順調ですね。しかし、私たちのお客様は、起動時に次の厄介な例外を受け取ることがあります。
HideSplashScreen() 中にエラーが発生したようですが、スタック全体が制御不能になっているため、この例外をキャッチすることはできません。
助言がありますか?