タグ付けされた質問 「dispose」


15
ファイナライズと破棄
一部の人々はなぜFinalizeメソッドよりもDisposeメソッドを使用するのですか? どのような状況で、FinalizeメソッドよりもDisposeメソッドを使用しますか?
215 c#  dispose 

10
Dispose()DataSetおよびDataTableを実行する必要がありますか?
DataSetとDataTableはどちらもIDisposableを実装しているため、従来のベストプラクティスでは、Dispose()メソッドを呼び出す必要があります。 ただし、これまで読んだことから、DataSetとDataTableには実際にはアンマネージリソースがないため、Dispose()は実際にはあまり機能しません。 さらに、using(DataSet myDataSet...)DataSetにはDataTablesのコレクションがあるため、単に使用することはできません。 安全のために、myDataSet.Tablesを反復処理し、各DataTableを破棄してから、DataSetを破棄する必要があります。 それで、私のすべてのDataSetsとDataTablesでDispose()を呼び出す手間は価値がありますか? 補遺: DataSetを破棄する必要があると思う人のために:Dispose()が呼び出されることを保証する必要があるため、通常、破棄のパターンはusingor を使用するtry..finallyことです。 ただし、コレクションの場合、これは非常に速く醜くなります。たとえば、Dispose()の呼び出しの1つが例外をスローした場合はどうしますか?それを飲み込んで(「悪い」)、次の要素の廃棄を続行できるようにしますか? または、myDataSet.Dispose()を呼び出して、myDataSet.TablesのDataTableを破棄することを忘れることをお勧めしますか?


7
どのようにしてIDisposableがすべてのクラスに広がるのを防ぎますか?
これらの単純なクラスから始めます... 次のような単純なクラスのセットがあるとします。 class Bus { Driver busDriver = new Driver(); } class Driver { Shoe[] shoes = { new Shoe(), new Shoe() }; } class Shoe { Shoelace lace = new Shoelace(); } class Shoelace { bool tied = false; } AにBusはがありDriver、にDriverは2つShoeのがあり、それぞれにShoeがありShoelaceます。すべて非常にばかげています。 IDisposableオブジェクトをShoelaceに追加する 後で、上のいくつかの操作をShoelaceマルチスレッド化できると判断したのでEventWaitHandle、スレッドが通信するためのを追加します。したがってShoelace、次のようになります。 class Shoelace { private AutoResetEvent waitHandle …

9
ガベージコレクターはIDisposable.Disposeを呼び出しますか?
.NET IDisposableパターン は、ファイナライザを作成してIDisposableを実装する場合、ファイナライザが明示的にDisposeを呼び出す必要があることを意味します。これは論理的であり、ファイナライザーが保証されているまれな状況で私が常に行ってきたことです。 ただし、これを実行するとどうなりますか? class Foo : IDisposable { public void Dispose(){ CloseSomeHandle(); } } ファイナライザなどは実装しないでください。フレームワークはDisposeメソッドを呼び出しますか? はい、これは馬鹿げているように聞こえることに気づき、すべての論理はそれが意味をなさないことを意味しますが、私はいつも頭の後ろに2つのものを持っていて、私を不確かにしました。 数年前に誰かが実際にこれを行うと私に言ったことがあり、その人は「自分のことを知っている」という非常に確かな実績を持っています。 コンパイラー/フレームワークは、実装するインターフェース(foreach、拡張メソッド、属性に基づくシリアライゼーションなど)に応じて他の「魔法」のことを行うため、これも「魔法」である可能性があります。 私はそれについて多くのことを読みましたし、暗示されていることはたくさんありますが、この質問に対する明確な「はい」または「いいえ」の答えを見つけることはできませんでした。

3
TPL TaskオブジェクトでDispose()を呼び出さないことは許容できると考えられますか?
バックグラウンドスレッドで実行するタスクをトリガーしたい。タスクの完了を待ちたくありません。 .net 3.5では、私はこれをしたでしょう: ThreadPool.QueueUserWorkItem(d => { DoSomething(); }); .net 4では、TPLが推奨される方法です。私が推奨する共通のパターンは次のとおりです。 Task.Factory.StartNew(() => { DoSomething(); }); ただし、StartNew()メソッドはTaskを実装するオブジェクトを返しますIDisposable。これは、このパターンを推奨する人々から見落とされているようです。Task.Dispose()メソッドに関するMSDNのドキュメントは言う: 「タスクへの最後の参照を解放する前に、必ずDisposeを呼び出してください。」 タスクが完了するまでタスクのdisposeを呼び出すことはできないため、メインスレッドを待機させてdisposeを呼び出すと、そもそもバックグラウンドスレッドで実行するポイントが無効になります。また、クリーンアップに使用できる完了/終了したイベントはないようです。 TaskクラスのMSDNページはこれについてコメントしておらず、 "Pro C#2010 ..."という本でも同じパターンを推奨しており、タスクの破棄についてはコメントしていません。 私がそのままにしておくとファイナライザーが最後にそれをキャッチしますが、これが戻ってきて、このような多くの火事をしていてファイナライザースレッドが圧倒されると、私に噛み付くのでしょうか? だから私の質問は: この場合Dispose()、Taskクラスを呼び出さなくても問題ありませんか?もしそうなら、なぜそしてリスク/結果はありますか? これについて説明しているドキュメントはありますか? それともTask私が見逃したオブジェクトを処分する適切な方法はありますか? または、TPLを使用してタスクを実行して忘れる別の方法はありますか?

7
WPFユーザーコントロールの破棄
サードパーティによる使用を目的としたカスタムWPFユーザーコントロールを作成しました。私のコントロールには使い捨てのプライベートメンバーがあり、ウィンドウ/アプリケーションを閉じたときに、そのdisposeメソッドが常に呼び出されるようにしたいと思います。ただし、UserControlは使い捨てではありません。IDisposableインターフェイスを実装してUnloadedイベントをサブスクライブしてみましたが、ホストアプリケーションが閉じても呼び出されません。可能であれば、特定のDisposeメソッドを呼び出すことを覚えているコントロールのコンシューマーに依存したくありません。 public partial class MyWpfControl : UserControl { SomeDisposableObject x; // where does this code go? void Somewhere() { if (x != null) { x.Dispose(); x = null; } } } これまでに見つけた唯一の解決策は、ディスパッチャーのShutdownStartedイベントをサブスクライブすることです。これは合理的なアプローチですか? this.Dispatcher.ShutdownStarted += Dispatcher_ShutdownStarted;
119 c#  .net  wpf  user-controls  dispose 

5
BaseStreamを閉じずにStreamWriterを閉じる方法はありますか?
私の根本的な問題は、ときということですusing呼び出すDisposeにはStreamWriter、それはまた、配置BaseStream(同じ問題を持つがClose)。 これには回避策がありますが、ご覧のとおり、ストリームのコピーが必要です。ストリームをコピーせずにこれを行う方法はありますか? これの目的は、文字列(元はデータベースから読み取られた)の内容をストリームに取得して、サードパーティのコンポーネントがストリームを読み取れるようにすることです。 注意:サードパーティのコンポーネントは変更できません。 public System.IO.Stream CreateStream(string value) { var baseStream = new System.IO.MemoryStream(); var baseCopy = new System.IO.MemoryStream(); using (var writer = new System.IO.StreamWriter(baseStream, System.Text.Encoding.UTF8)) { writer.Write(value); writer.Flush(); baseStream.WriteTo(baseCopy); } baseCopy.Seek(0, System.IO.SeekOrigin.Begin); return baseCopy; } 使用されます public void Noddy() { System.IO.Stream myStream = CreateStream("The contents of this string are …
117 c#  stream  dispose 

5
ステートメントの使用が終了する前に戻るとどうなりますか?破棄は呼び出されますか?
私は次のコードを持っています using(MemoryStream ms = new MemoryStream()) { //code return 0; } dispose()この方法は、の終了時に呼び出されるusing文のかっこ}右?I以来 returnの終了前にusing声明、うMemoryStreamオブジェクトが適切に配置されても?そこで何が起こるの?

7
C#でのIDisposableとデストラクタの使用の違いは何ですか?
いつデストラクタではなくクラスにIDisposeを実装しますか?この記事を読みましたが、まだ要点がありません。 私の想定では、IDisposeをオブジェクトに実装すると、ガベージコレクターがIDisposeを実行するのを待つのではなく、明示的に「破棄」できるということです。これは正しいです? つまり、常にオブジェクトに対してDisposeを明示的に呼び出す必要がありますか?これのいくつかの一般的な例は何ですか?
101 c#  .net  dispose  destructor 

7
IDisposableオブジェクト参照が破棄されているかどうかをどのように判断しますか?
廃棄されたオブジェクトへの参照であるかどうかを確認する方法、またはその他の軽量な方法はありますか? PS-これは単なる好奇心です(本番コードではなく、よく眠れます)。はい、ObjectDisposedExceptionオブジェクトのメンバーにアクセスしようとすると、キャッチできることを知っています。
88 c#  .net  dispose  idisposable 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.