問題タブ [weak-events]
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.
wpf - 他の場所でライフタイムを管理する代わりに、コントロールで弱いイベントパターンを使用するのはなぜですか?
弱参照と弱イベントパターンを理解しています。
弱いイベントパターンが使用される場所の1つは、コントロールとDataModel間のDataBindingです。DataBindingのプロセス中に、DataModelがINotifyPropertyChangeをサポートしている場合、コントロールはDataModelにイベントを通じて変更についてアドバイスするように要求します。弱いイベントがなければ、DataModelはコントロールにハードリファレンスを保持していました。その参照のため、ウィンドウがGCで使用可能になると同時に、コントロールをGCで使用可能としてマークすることはできませんでした。
Microsoftは、この問題を解決するために弱参照を使用することを決定しました。
提案されたもののような他の選択肢はもっと良くなかっただろうか?
代替案:DataModelへのDataBindingを削除するように要求するために、子UiElementsを渡すコードを使用してウィンドウにIDisposableを実装しますか?その解決策で何が間違っていただろうか?
.net - .NET に WeakDelegate がない理由を説明できる人はいますか?
このエンティティを実装するためのアーキテクチャ上の制約はありません。.NET 4.5 にはそれがなく、WeakEventManager はまだゲーム内にあります。
私は MS の人間が怠け者だとか愚かだとは思いません。しかし、何?...
c# - イベント名ラムダ式とカスタム イベント アクセサーを持つ WeakEventManager
弱いイベント パターンを使用してイベントにサブスクライブすることを検討しています。.NET 4.5 フレームワークでは、洗練された外観のWeakEventManagerクラスがあります。イベントへの弱いサブスクライブは、次のように簡単です。
しかし、私は「stringly-typed」コードの大ファンではありません。サブスクライブするイベントの文字列名を使用する方法を見つけようとしています。イベントの名前を取得する唯一の方法は、イベントを定義するクラスでラムダ式を使用することです。私のシナリオでは、イベントを定義するクラスを所有しているので、好きなように変更できます。私は自分のイベントを購読および購読解除するためのクリーンな方法を見つけようとしていますが、これが私が最も嫌いなものです.
カスタム イベント アクセサーを使用することで、LoggingOn_Subscribe(EventHandler) のような不格好な (私の意見では) メソッドや、各イベントの名前プロパティの追加を回避できました。残念ながら、イベントにサブスクライブしている人々が従来の方法でサブスクライブしているため、それほど直感的ではありませんが、サブスクライブが弱いことを示す名前の "_Weak" 部分以外はわかりません。
私の質問に関しては..
1) 弱いイベントやカスタム イベント アクセサーを使用したことがありません。上記のコードは機能しているように見えますが、技術的に問題がないことを確認したいと思います。ここで自分の足を撃つために何かしていることはありますか?
2) デザインの観点から、これはひどい考えですか? 考慮すべき重要な設計上の問題はありますか? より良い代替手段はありますか?文字列型のイベント名を使用してサブスクライバーからサブスクライブする必要がありますか?
考え?
c# - 弱参照を使用してサードパーティのロングライフイベントをリッスンするC#
私は、イベント ハンドラーが原因で、存続期間が短い可能性のあるオブジェクトを存続させることになる、サード パーティの存続期間が長い Deleted イベント発行元にアタッチしています。Deleted イベントがトリガーされることはほとんどありません。発生した場合は処理する必要があります。Deleted イベントのサブスクライブを解除する場所が明確ではないため、オブジェクトを GC できるように弱い参照が必要です。
弱いイベント ハンドラーを作成する非常に精巧な方法を数多く見てきましたが、少なくとも提供されたテスト スニペットでは、次のスニペットがそのトリックを実行しているようです。これはただの狂気ですか、それともうまくいきますか?
( http://diditwith.net/CommentView,guid,aacdb8ae-7baa-4423-a953-c18c1c7940ab.aspxは、「A First Stab」の下で、同様のスニペットは「(...) で使用するほど堅牢ではありません。イベント(...)」、なぜですか?)
テストクラス
c# - C#静的クラスで弱いイベントパターンを使用することは可能ですか?
巨大な設定ファイルを渡すという考えが気に入らなかったので、使用していた静的クラスがありますが、インスタンスが静的クラスの静的イベントにサブスクライブできるようにしたいと考えました。
PropertyChangedEventManager の AddListener メソッドの使用を検討していましたが、追加するにはインスタンスが必要です。
これは可能ですか?問題がある場合に備えて、私は.net 4.0を使用しています。
c# - CollectionChangedEventManager がカスタム コレクションのイベントを転送しない
INotifyCollectionChanged
基本的に標準をラップするだけのカスタムクラスがありますObservableCollection
。何かが追加/削除されるたびに、CollectionChanged
期待どおりにイベントが発生します。ただし、を使用してこのイベントをリッスンしようとするWeakEventListener
と、リスナーはイベントを受け取りません。なぜこれが起こっているのですか?どうすれば修正できますか?
以下のサンプルでは、 aNotImplementedException
がスローされることを期待しますが、テスト ケースは成功します (これは、イベントが実際に発生したことを明確に示しています)。コレクションをObservableCollection
ではなく に変更するとWrapper
、期待どおりに例外がスローされます。
関連している可能性がありますが、まだ回答がありません:
送信者が公称ではない場合、WeakEventManager がイベントを発生させないのはなぜですか?
c# - 共有プロパティMVVMにWeak Event Patternを実装する正しい方法
複数のオブジェクトを持つアプリケーションを準備しています。それぞれに整数の ID と文字列データがあります。同じIDを持つオブジェクトのデータを同じにしたい。このオブジェクトを SharedObject と呼びます (このオブジェクトは、一部のデータベース テーブルの ViewModel のように機能します)。
とても簡単だと言えるかもしれません。オブジェクトを 1 つ作成し、必要なときにいつでも参照できます。しかし、実際には、オブジェクトがいつどこで作成されるかを予測できないため、この方法はうまくいきません。
したがって、この問題を処理するために、SharedObject クラスに静的イベントを配置し、SharedObject データが変更されたときにそれを呼び出すことにしました (INotifyPropertyChanged の PropertyChanged イベントのように、私のものは静的です。これにより、SharedObject の各インスタンスに表示されます)。問題は、メモリリークだらけのプログラムになってしまうことです!!
昨夜、メモリ リークの問題を解決するには弱いイベント パターンを使用する必要があることを整理しました。
弱いイベント パターンの完全な実装を求めて昨夜ネットを検索しましたが、最終的には何も表示されなかったか、ページが削除されました。
最後に、弱いイベント パターンでそれを行う方法を見つけ、このアプローチをテストするテスト プロジェクトを作成しましたが、うまくいきませんでした。ReceiveWeakEvent イベントを呼び出すことができませんでした。
何か不足していますか?または、このパターンを実装する正しい方法は何ですか?
ちなみに、私はアプリケーションで Win XP をサポートする必要があるため .net 4 を使用しています (これは私の顧客が必要としているものです。それについて私に尋ねないでください)。そのため、一般的な WeakEventManager クラスを使用できません。
長い投稿で申し訳ありませんが、この問題は私が髪を引き裂くところだったので、事前に感謝します.
完全なアプリケーション コードは次のとおりです。
SharedObject クラス:
WaekEvent および SharedWeakEventManager クラス:
MainWindow の XAML 部分:
MainWindow クラス:
c# - 弱いイベントと GC
決定論的にサブスクライブを解除できない場合は、弱いイベントを使用しています (それ以外の場合は、弱いイベントの代わりに優先+=
します)。-=
このように、オブジェクトがガベージ コレクションされた場合、イベント ハンドラーは呼び出されません。完全。
でも。オブジェクトがまだガベージ コレクションされていない場合 (ただし、強い参照がなくなった場合)、イベント ハンドラーは引き続き呼び出されます。
私の質問はかなり一般的です:弱いイベントを使用するときはどうすればよいですか? 弱いイベントを使用する場合、イベント ハンドラーで無効な呼び出しを予期する必要がありますか? または、 GCにそのケースを回避するように強制する必要があります(決定論的な「クリーンアップ」のようなもの)? 他の何か?