- - PR -
高負荷時のテキストファイル書き込みで例外が発生する
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-02-01 09:03
それは Dispose メソッドでも同じです。
GC.Collect メソッドを毎回呼び出したりしたら余計に高負荷になります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-02-01 12:09
私が勉強した限りでは違ったのですが、今回は当てはまらないのでしょうか? 下記の「Dispose の実装理由」に書かれています。 http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbconinitializationterminationofcomponents.asp
それは根本的に、じゃんぬねっとさんのご指摘どおり最初に作成して使い回す 方法に同意しております。 | ||||||||||||
|
投稿日時: 2006-02-01 12:33
# 本題からどんどん外れていくわけですが...
Dispose メソッドを実行すると即座に Finalize が呼び出されるなどとは書いてありません。 # Finalize といっても、回収された結果呼び出されるという意味で、 # 即座に回収されませんよね? という意味です。
もう 1 度書きますが、Close メソッドでも Dispose メソッドでも、 リソースの回収はガベージ コレクションが行います。 どちらも回収のタイミングは、特に何もしなければ GC の気分次第です。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-02-01 12:38
確かにどちらもガベージコレクションです。失礼しました。 | ||||||||||||
|
投稿日時: 2006-02-01 14:10
例外時のスタックトレースはどうなっていますか?
| ||||||||||||
|
投稿日時: 2006-02-01 22:16
スレッド趣旨から離れていますが、ちょっと気になったので。
Dispose とガーベッジ コレクションは、関係ありません。 Dispose は、アンマネージド リソースの解放を指示します。 ガーベッジ コレクションは、マネージド リソースのうち、参照されていないものを回収します(全部を回収するわけではない)。 ただし、IDisposable インターフェイスを実装するクラスは、ファイナライザ(デストラクタ)にて、Dispose を実行することを義務づけられています(コンパイラがチェックするわけではないので、そのような実装になっていないこともある)。したがって、ガーベッジ コレクタがマネージド リソースの回収を行うとき、アンマネージド リソースの回収も行われることを期待できます(実装が保証されているわけではない)。 Mutex.Close をコールしたからと言って、確かにマネージド リソースの解放は行われません。しかし、アンマネージド リソースの解放は、Close メソッド内で行われます。なぜなら、Mutex クラス(の親である WaitHandle クラス)では IDisposable.Dispose メソッドを明示的に実装して隠していると思われるからです。WaitHandle.Close メソッドの説明には、次のように書かれています。
これにより、Close メソッドは、IDisposable.Dispose と等価になるように実装されていると判断できます。 で、この事例ですが、私は複数のプロセスが、ログ ファイルにアクセスするのではないか、と考えています。その為に Mutex で、ファイルにアクセスするプロセスを1本に絞ろうとしている、と。なので、わざわざ Mutex オブジェクトを作らなくても、FileShare.None で弾けばいいんじゃないか、と。 〆 written by Jitta on 2006/02/01 | ||||||||||||
|
投稿日時: 2006-02-01 23:21
趣旨から外れますがさらに気になったので。大筋であってると思うんですが、2.0から方向性がちょい変わってます。Disposeはアンマネージリソースの解放だけではなく、汎用の確定的デストラクションのようになってる感じです。C++/CLIのデストラクタとかTransactionScopeとか見てると。
私もそう思いますが、弾くんではなく調停(同時にアクセスしない&安全に待つ)を望んでいるでしょうからMutex使うのはありだと踏みます。 どっちにしろスタックトレース待ちかな。現状の情報だと原因が見えない。 | ||||||||||||
|
投稿日時: 2006-02-02 02:10
南部です。
念の為、
これは、C++/CLIに関してのみですよね? C#はもともとusingステートメントによって確定的破棄ができて、 これは、2.0でも同じ方向性である認識です。 #違ってたらドキュメント読み直し、、 | ||||||||||||
