問題タブ [object-lifetime]
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.
java - アクティビティへの長期的な参照-ライフサイクル
ファイルのダウンロードと永続化を担当するシングルトンクラス(ダウンローダー)があるとします。クライアントがダウンロードを要求するときは、コールバックも提供する必要があります。私の質問は、それらのコールバックオブジェクトのストレージに関するものです。
コールバックインターフェイスを実装し、複数の大規模なダウンロードを要求するアクティビティがある場合、Downloaderクラスはアクティビティへの参照を無期限に保持します。ダウンロードが完了する前に、ダウンロードを要求したアクティビティがそのライフサイクルを通過し、破棄された場合はどうなりますか。
この場合、ダウンローダーはリサイクル業者がアクティビティをガベージコレクションするのを防ぎます。要求されたダウンロードが続行されてもかまいません。しかし、私がやりたいのは、提供されたコールバックが収集されるべきであることをどういうわけか検出し、それを効果的にリークしていることです。
このようなデザインパターンはありますか?Referenceサブクラスの1つが役立つだろうと思っていました。
ありがとう。
aop - Spring.NET はカスタム オブジェクトのライフタイムの作成をサポートしていますか?
本.NET での Dependency Injectionの中で、著者は、Spring.NET はカスタム オブジェクトの有効期間の作成をサポートしていないと述べています (セクション 12.2 [有効期間の管理] の最後の段落を参照)。
私はフレームワークに慣れていませんが、そうではないかもしれないと思います。これまでの調査に基づいて、ITargetSource インターフェイスを実装することでカスタム ライフタイムを定義できると思いますが、おそらく、このインターフェイスはそれ以上のことを行うことができます (定義済みの実装には、オブジェクト プーリングやホットスワップ可能なターゲットなどが含まれるなど)。
私の理解は正しいですか?はいの場合、カスタム ライフタイムを作成および構成するための正確な論理手順は何ですか? いいえの場合、Spring.NET でカスタム オブジェクトの有効期間を作成するにはどうすればよいですか?
c# - db接続を手動で開いたり閉じたりするリポジトリを用意するのは悪い習慣ですか?
環境:ASP.NET MVC3 C#
リポジトリ(セミプセド)があるとしましょう:
次に、コントローラーにリポジトリーが挿入され、次のように使用されて、データベース接続の有効期間を手動で制御します。
これは、リポジトリから接続を制御してコントローラーに配置するため、悪い習慣と見なされますか?依存性注入を使用することによるメモリリークが心配であり、重複する接続が開かれたり、長時間実行されて使用されたりしないようにしたいと考えています。
c++ - ターゲットに関する参照の存続期間
私が最近行った回答のコメントで進行中の議論を食い止めるために、次の質問に対する建設的な回答をお願いします。
- 参照の有効期間は、それが参照するオブジェクトとは異なりますか? 参照は単にそのターゲットのエイリアスですか?
- 参照は、未定義の動作を引き起こすことなく、整形式のプログラムでそのターゲットを存続させることができますか?
- 元のオブジェクトに割り当てられたストレージが再利用される場合、新しいオブジェクトを参照するために参照を作成できますか?
- 次のコードは、未定義の動作を呼び出すことなく上記の点を示していますか?
Ben Voigtによるコード例と簡略化 ( ideone.comで実行):
c++ - ブーストのshared_ptrを使用してCタイプのライフサイクルを管理していますか?
Boost ライブラリのスマート ポインタを使用してオブジェクトの有効期間を管理する方法と同様の質問があります。しかし、私の場合、「オブジェクト」は C++ オブジェクトではなく、C API から返された/渡された不透明な型です。型にはポインターのセマンティクスがありません。つまり、逆参照はありません。ただし、C API の他の関数に引数として渡されます。この型には、close内部リソースをクリーンアップするために呼び出す必要がある決定的な API もあります。
だから、私は次のようなC APIを持っています
さまざまな理由から、私の C++ コードでは、opaque_legacy_type_t の「インスタンス」を、ヒープに割り当てられたオブジェクト インスタンスを管理するのと同じように管理したいと考えていますboost::shared_ptr<>。これshared_ptrを行うことで呼び出しを管理できるほど十分に提供さXXcloseれているようです:
しかし、 にopaque_legacy_type_tはポインターのセマンティクスがないため、 の使用法managedは少しぎこちないです。
私がやりたいのは、managed_typeに似たのようなものを持ちshared_ptr、すべてを書く必要のないアイデアを探しています。
編集: 例の元の失敗を修正しました。従来の API は、不透明型をポインターではなく値で受け取ります。
c# - ライフタイムスコープを使用するときにランタイムパラメータを処理する方法は?
警告、長い投稿が先です。
私は最近これについてよく考えていて、ここで満足のいく解決策を見つけるのに苦労しています. 例では C# と autofac を使用します。
問題
IoC は、ステートレス サービスの大きなツリーを構築するのに最適です。サービスを解決し、メソッド呼び出しにのみデータを渡します。偉大な。
場合によっては、データ パラメーターをサービスのコンストラクターに渡したいことがあります。それが工場の目的です。サービスを解決する代わりに、そのファクトリを解決し、パラメーターを指定して create メソッドを呼び出してサービスを取得します。もう少し作業がありますが、OKです。
時々、サービスを特定のスコープ内の同じインスタンスに解決したいと考えています。AutofacInstancePerLifeTimeScope()は非常に便利な機能を提供します。これにより、実行サブツリー内の同じインスタンスに常に解決できます。良い。
また、両方のアプローチを組み合わせたい場合もあります。コンストラクターにデータパラメーターが必要で、インスタンスのスコープが設定されています。これを達成するための満足のいく方法は見つかりませんでした。
ソリューション
1.メソッドの初期化
データをコンストラクターに渡す代わりに、Initializeメソッドに渡すだけです。
インターフェース:
クラス:
登録:
使用法:
初めてサービスを解決して Initialize を呼び出した後、同じコンテキスト内で問題なく解決し、初期化された同じインスタンスを取得できます。Initialize呼び出す前に使用できないオブジェクトがあるという事実は好きではありません。Initialize() を呼び出す前に、インスタンスが解決されて別の場所で使用される危険性があります。
2.ホルダーパターン
これは、データ オブジェクトへの参照を保持するパターンであり、データ オブジェクト自体を注入する代わりに、ホルダー オブジェクトを注入します。
インターフェース:
クラス:
登録:
使用法:
インスタンスを保持する責任を別のクラスに移したので、これは少し良くなりました。他のサービスでもホルダーを使用できるようになりました。その他の利点は、必要に応じてホルダー内のデータをホットスワップできることです。コードが難読化され、テスト中にモックしなければならない別のインターフェイスが追加されるという事実は好きではありません。
3.コンテナにインスタンスを保持させる
インターフェース:
クラス:
登録:
使用法:
それは正しい。autofac が保存してくれるので、ファクトリ コールの結果はどこにも保存しません。これは、コードを読む人にとってはかなり驚くべきことです。autofac がこのように使用されることを意図していたのかどうかはわかりません。これの良いところは、インスタンスを保持するための追加の初期化メソッドも追加のクラスも必要ないことです。
質問
これについてどう思いますか?実行時のデータ パラメーターと有効期間のスコープを使用して状況をどのように処理しますか? より良いアプローチがありませんか?
.net - AppDomainはInitializeLifetimeServiceを部分的にのみ尊重します(あるとしても)
Timiz0rのおかげで、この問題は解決しましたが、多段階であるため、ここで完全な解決策について詳しく説明します。元の質問は以下のとおりです。まず、ILS関数を次のように変更しました。
次に、これをプログラムとAに含めました。Timiz0rが指摘したように、FormはMarshalByRefObjectを継承するため、メインクラス(すでにFormを継承している)にInheritsステートメントを含める必要はありませんでした。もともと含まれていなかったので、これは大きなことでした。次に、AppDomainの設定を次のように変更しました。
これらの変更により、必要に応じてDLLCOMオブジェクトの個別のインスタンスを使用できるようになりました。
元の質問
オブジェクトのリストを作成するアプリケーションを作成しています。各オブジェクトはDLLを参照し、各オブジェクトは独自のAppDomainに配置されて、DLLのインスタンスが相互に干渉しないようにしています。別の方法で:
- プログラムは(Aの)リストを維持します
- Aは、 CreateInstanceAndUnwrapを使用してAppDomainのインスタンスとして作成されます
- 各Aは、アプリケーションの参照に含まれているmirror.dllを参照します
ドメインを設定するときに、InitializeLifetimeServiceの呼び出しが尊重されないことを除いて、これはすべて問題なくダンディです...一種の。デフォルトの5分間待機し、Aのいずれかを呼び出した後、RemoteExceptionエラーが発生します。ただし、いくつかのTry / Catchステートメントを入力すると、問題のAに到達できることがわかりましたが、RaiseEventを試行すると失敗します。さらに、DLLオブジェクト自体がドロップされているようです(または、RaiseEventを実行しようとすると失敗することもよくあります)。
この記事によると、AppDomainのオーバーライドにより、有効期限が切れないリースが自動的に作成されます。だから私はこれを試してみます:
サイコロはありません。別のMSDNの記事によると、InitializeLifetimeServiceをオーバーライドしてNothingを返すと、同じことが行われます。したがって、Aクラス内では、次のことを行います。
繰り返しますが、何も起こりません。それで、さらに別の記事を見て、私はただ長い借金を設定しようとします:
この問題の一部は、初期状態でAを取得できないことのようです。しかし、以前の設定を使用して常にNothingを返す場合、それは問題にはなりませんよね?残念ながら、この種のことを行うための例はほとんどないので、私は何か間違ったことをしている可能性があります。私はこれにどのように取り組むべきかについてすべての耳を持っています、私がこの問題を克服することができないならば、プロジェクト全体は無意味です。
(サードパーティのクローズドソース)DLLはシリアル化できず、MarshalByRefObjectを継承する可能性は非常に低いことをお伝えしておきます。これが、クラスをDLLではなくAppDomainに配置した理由ですが、問題の一部である可能性があります。
この質問は関連しているかもしれませんが、セットアップは私が行っているものとは異なり、C#用であり、頭の中でVBに変換するのに少し問題があります。
unity-container - 古いデータを扱うエンティティ フレームワーク コンテキスト
Unity を使用してコンテキストを注入し、次のライフタイム マネージャーを使用しています...
- ページ 1 への最初の要求: 値を表示します。
- ページ 2 への最初の Web 要求: 値を更新します。
- ページ 1 への 2 番目の Web 要求: 古い値を表示します。
- 2 ページ目への 2 番目の Web 要求: 新しい値を表示します。
ページ 1 に新しい値を表示するには、VS 開発サーバーを再起動する必要があります。
では、どのようにしてコンテキストを a) ページ リクエスト間で存続させ、b) ページに固有にすることができるのでしょうか?
c# - スレッドで作成されたオブジェクトの有効期間について説明が必要
BindingList にバインドされた DevExpress GridControl があります。
スレッドから BindingList を変更しようとしたところ、例外がスローされました。Google で調べたところ、次の説明が見つかりました。
この問題は XtraGrid とは直接関係ありません。残念ながら、同期で多くの問題が発生するため、バックグラウンド スレッドでグリッドのデータ ソースを変更することはできません。XtraGrid は、バックグラウンド スレッドがデータ ソースを変更すると同時に、基になるデータ ソースに対していくつかの操作を実行する場合があります。この場合、グリッドは後で変更通知を受け取り、データ ソースから行を更新しようとするため、上記の問題が発生します。この問題は、多くの場合に発生する可能性があります。たとえば、ユーザーがデータを編集したり、データをグループ化したり、XtraGrid が集計を再計算しようとしたりする場合です。この問題の唯一の解決策は、バックグラウンド スレッド内でグリッドの DataSource 参照を変更することです (注: Invoke メソッドを使用して実装する必要があります)。別の言い方をすれば、バックグラウンド スレッド内で、DataSource のローカル コピーを操作し、必要に応じてそのクローンをグリッドの DataSource に渡す必要があります。添付の例には、このアプローチを示すサンプル プロジェクトがあります。
私はそれが言ったことを試しました。その結果、次のようになりました。
それは機能しますが、スレッドが終了した後にデータソースに何が起こるのか理解できませんか? newList破壊されていませんか?
私が考えていたのは、最後にnewListを再クローンしてproxies(元のデータソース)に戻すことです
c++ - 関数パラメーターにバインドされた参照は、その一時的な寿命を延ばしますか?
私はこのコードを持っています(簡易版):
C++03 標準 $12.2/5 文言がどの程度かは、よくわかりません。
参照がバインドされている一時、または一時がバインドされているサブオブジェクトへの完全なオブジェクトである一時は、参照の存続期間中持続します...
ここに適用されます。
上記のコードの変数は有効ですreferenceか、それともぶら下がっていますか? 呼び出し元のコードでの参照は、パラメーターとして渡された一時の有効期間を延長しますか?