問題タブ [disposable]
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# - ファイナライザーと破棄
BackgroundWorker
スレッドが常に実行されているという名前のクラスがあります。このスレッドをオフにするには、 to という名前のインスタンス変数がstop
である必要がありますtrue
。
クラスの使用が終了したときにスレッドが確実に解放されるようにするために、IDisposable
を呼び出すファイナライザーを追加しましたDispose()
。それが実際にこのスレッドを終了させると仮定するとstop = true
、このシペットは正しいですか? ファイナライザーから呼び出しDispose
てもいいですよね?
継承するDispose
場合、ファイナライザーは常に呼び出す必要がありますよね?object
IDisposable
inversion-of-control - ServiceContainer、IoC、および使い捨てオブジェクト
質問があります。この主観的なものにタグを付けるつもりです. 良いアイデアや示唆に富んだものを期待しています。長々とした質問で申し訳ありませんが、文脈を知る必要があります。
質問は基本的に次のとおりです。
- IoC コンテナーに関連して具象型をどのように処理しますか? 具体的には、それらを破棄する必要がある場合、誰がそれらを破棄する責任がありますか? また、その知識は呼び出し元のコードにどのように伝達されますか?
それらを IDisposable にする必要がありますか? そうでない場合、そのコードは将来性がありますか、それとも使い捨てオブジェクトを使用できないという規則ですか? インターフェイスと具象型に IDisposable-requirements を適用して将来的に保証する場合、コンストラクター呼び出しの一部として挿入されるオブジェクトは誰の責任ですか?
編集: @Chris Ballardの回答を受け入れました。これは、最終的なアプローチに最も近いものだからです。
基本的に、常に次のような型を返します。
次に、このインターフェイスを実装するオブジェクトを .Resolve と .TryResolve の両方から返すので、呼び出しコードで取得するものは常に同じ型になります。
現在、このインターフェイスを実装するオブジェクトIService<T>
は IDisposable であり、常に破棄する必要があります。IService<T>
サービスを解決してオブジェクトを破棄するかどうかを決定するのは、プログラマの責任ではありません。
ただし、これは重要な部分であり、サービス インスタンスを破棄する必要があるかどうかに関係なく、その知識は を実装するオブジェクトに組み込まれているIService<T>
ため、ファクトリ スコープのサービスである場合 (つまり、Resolve への各呼び出しは新しいサービス インスタンスで終了します) )、IService<T>
オブジェクトが破棄されるときにサービス インスタンスが破棄されます。
これにより、プーリングなどの他の特別なスコープをサポートすることも可能になりました。これで、最小で 2 つのサービス インスタンス、最大で 15、通常は 5 が必要であると言えます。これは、.Resolve を呼び出すたびに、使用可能なオブジェクトのプールからサービス インスタンスを取得するか、新しいインスタンスを構築することを意味します。その後、IService<T>
プールされたサービスを保持するオブジェクトが破棄されると、サービス インスタンスはそのプールに解放されます。
確かに、これによりすべてのコードは次のようになります。
しかし、これはクリーンなアプローチであり、使用中のサービスや具体的なオブジェクトのタイプに関係なく同じ構文を使用するため、受け入れ可能なソリューションとしてこれを選択しました。
後世のために、元の質問が続きます
長い質問がここに来ます:
使用している IoC コンテナーがあり、最近、何が問題になるかを発見しました。
IoC 以外のコードで、たとえばファイルを使用したい場合、次のようなクラスを使用しました。
ファイルを閉じる必要があることはわかっており、クラス自体が IDisposable を実装していたため、このクラスが限られたリソースを保持するものであったかどうかは疑問の余地がありませんでした。ルールは、IDisposable を実装する、オブジェクトを構築するすべてのクラスを破棄する必要があるという単純なものです。質問はありません。Dispose の呼び出しがオプションかどうかを決定するのは、このクラスのユーザー次第ではありません。
では、IoC コンテナーに向けた最初のステップに進みましょう。コードがファイルと直接やり取りするのではなく、1 つの間接的なレイヤーを通過することを望んでいないと仮定しましょう。この例では、このクラスを BinaryDataProvider と呼びましょう。内部的には、クラスはまだ使い捨てオブジェクトであるストリームを使用しているため、上記のコードは次のように変更されます。
これはあまり変わりません。クラスが IDisposable を実装しているという知識はまだここにあります。質問はありません。Dispose を呼び出す必要があります。
しかし、現時点ではそのような限られたリソースを使用しないデータを提供するクラスがあると仮定しましょう。
上記のコードは、次のように記述できます。
OK、ここまでは順調ですが、ここからが本題です。特定の具象型に依存するのではなく、IoC コンテナーを使用してこのプロバイダーを注入するとします。
コードは次のようになります。
オブジェクトにアクセスできる独立したインターフェースが利用可能であると想定していることに注意してください。
上記の変更により、実際に破棄する必要があるオブジェクトを後で使用したい場合はどうなるでしょうか? そのインターフェイスを解決する既存のコードは、オブジェクトを破棄するように記述されていません。
私たちの見方では、解決策を 1 つ選択する必要があります。
- 登録されている具象型が IDisposable を実装しているかどうかを確認する実行時チェックを実装し、それを介して公開されるインターフェイスも IDisposable を実装する必要があります。これは良い解決策ではありません
- 使用されるインターフェイスに制約が課せられる前に、それらは常に IDisposable から継承する必要があります。
- 具体的な型を IDisposable にできないランタイムを強制します。これは、IoC コンテナーを使用するコードによって具体的に処理されないためです。
- オブジェクトがIDisposableを実装して「正しいことをする」かどうかをチェックするのはプログラマーに任せてください。
- 他にもありますか?
また、コンストラクターにオブジェクトを注入するのはどうですか? 私たちのコンテナ、および調査した他のコンテナのいくつかは、具象型のコンストラクターのパラメーターに新しいオブジェクトを注入することができます。たとえば、インターフェイスBinaryDataProvider
を実装するオブジェクトが必要な場合ILogging
、これらのオブジェクトに IDispose-"機能" を適用する場合、ロギング オブジェクトを破棄するのは誰の責任でしょうか?
どう思いますか?良くも悪くも意見が欲しいです。
c# - オブジェクトを null に設定する vs Dispose()
私は CLR と GC の仕組みに魅了されています (C# を介して CLR を読んだり、Jon Skeet の書籍や投稿などを読んだりして、これに関する知識を広げようとしています)。
とにかく、言うことの違いは何ですか:
または、MyClass に IDisposable とデストラクタを実装させ、Dispose() を呼び出すことによって?
また、using ステートメント (以下など) を含むコード ブロックがある場合、コードをステップ実行して using ブロックを終了すると、オブジェクトは破棄されますか、それともガベージ コレクションが発生したときに破棄されますか? とにかく、using ブロックで Dispose() を呼び出すとどうなりますか?
ストリーム クラス (BinaryWriter など) には Finalize メソッドがありますか? なぜそれを使いたいのですか?
api - 使い捨てメールアドレスを見つける
私は undisposable.net の API を使用して使い捨てのメール アドレスを見つけていましたが、サイトが機能していないように見えることに気付きました。
彼らに何が起こったのか知っている人はいますか?使い捨ての電子メール アドレス ドメインに API を提供するサイトは他にありますか? または、ダウンロードして確認できるリストはありますか?
編集: 明確化:使い捨ての電子メール アドレスを作成したくありません。登録フォームで送信したメールアドレスが使い捨てかどうかを確認したい。
c# - C#IDisposable質問
次のコード例があります。
さて、それは本当に悪いですか?よくわかりませんが、これは、で基本クラスのデストラクタを仮想としてマークしないC++
のとほぼ同じようです。
IRepository
インターフェースを実装させたくありませんIDisposable
。それは、望ましくない複雑さと、実装しなければならないクラスの束をもたらすからIDisposable
です。
このケースはどのように処理する必要がありますか?
派生型の1つが使い捨てリソースを管理する必要がある場合、これはどの型階層でも発生する可能性があると確信しています。
では、どうすればよいIDisposable
ですか?最初のインターフェイスまでプルアップするか、そのままにして、ユーザーが使い捨てリポジトリと非使い捨てリポジトリを区別することを期待しますか?
ありがとうございました。
c# - C# 使い捨てオブジェクト
IDisposable
オブジェクト シーケンスの処理方法に関するアドバイスはありますか?
たとえば、IEnumerable<System.Drawing.Image>
シーケンスを構築するメソッドがあり、ある時点でそのオブジェクトを手動で破棄する必要があります。そうしないと、リークが発生する可能性があるためです。
さて、これらのオブジェクトを他のコード部分からアクセスできなくなっDispose()
た瞬間に破棄したいので、呼び出しをガベージ コレクター アクションにバインドする方法はありますか?
**または、他のアプローチについてアドバイスをいただけないでしょうか? **
一般に、これは同じ問題のようです。たとえば、 unmanaged C++
without shared pointersでは、メソッドを使用できます。
コード コントラクトを使用しないか、コメントに何かを記載しないと、いつ破棄するかわかりません。
使い捨てオブジェクトの状況はかなり同じだと思いますが、これに対する適切な解決策があることを願っています.
c# - この Entity Framework の実装はメモリ リークを起こしますか?
Web アプリケーションまたはコンソール アプリケーションの using ステートメントで使用される場合、エンティティ コンテキストが使用フローで破棄されるかどうかはわかりません。
ありがとう!
performance - 違いがないように見えるのに、DataContainer または DataContext で Dispose を呼び出す必要があるのはなぜですか?
DataContainer オブジェクトに対して Dispose を呼び出す場合と呼び出さない場合のメモリと速度の違いを調べる簡単なテスト プログラムを作成します。
ここで私のテストプログラム:
どちらの方法でも結果は同じです。私の PC での結果は、約 27.22 秒で、約 37.7 MB のプライベート メモリ サイズでした。
違いがないのに、なぜ DataContainers の Dispose を呼び出す必要があるのでしょうか。
前もって感謝します。
ffmpeg - H.263 SorensonSparkDフレームのデコードに関する問題
avcodec_decode_video関数を使用してH.263sorensonタイプのデータをデコードしようとしています。
IフレームとPフレームをデコードできますが、データにいくつかのDフレーム(使い捨てインターフレーム)があり、この関数はこれらのフレームをデコードできず、戻り値としてゼロを取得しています。
したがって、ENUM値にもDフレームについての言及がないため、これらのタイプfフレームをデコードする方法を誰かに教えてもらえますか。
DフレームをPフレームに変換できることをどこかで読んだことがありますが、生データがある場合、デコード関数を直接使用したい場合は、それをどのように達成するかを説明します。