- PR -

高負荷時のテキストファイル書き込みで例外が発生する

投稿者投稿内容
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-01 09:03
引用:

マー帽さんの書き込み (2006-02-01 07:43) より:

開放漏れではなく、高負荷でガベージコレクションの処理が遅れる事によって
開放が遅延しているのではないかという予想です。
Close メソッド後のリソース開放はガベージコレクションが行いますが、
それは Close 後ただちに行われるのではなく、多少なりとも遅延する可能性がありますよね?


それは Dispose メソッドでも同じです。

引用:

連続して処理するのであれば、遅延するかも知れない開放より
確実に開放してから処理を継続する方が良いように思います。


GC.Collect メソッドを毎回呼び出したりしたら余計に高負荷になります。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
マー帽
常連さん
会議室デビュー日: 2006/01/31
投稿数: 21
投稿日時: 2006-02-01 12:09
引用:

じゃんぬねっとさんの書き込み (2006-02-01 09:03) より:
引用:

マー帽さんの書き込み (2006-02-01 07:43) より:

開放漏れではなく、高負荷でガベージコレクションの処理が遅れる事によって
開放が遅延しているのではないかという予想です。
Close メソッド後のリソース開放はガベージコレクションが行いますが、
それは Close 後ただちに行われるのではなく、多少なりとも遅延する可能性がありますよね?


それは Dispose メソッドでも同じです。


私が勉強した限りでは違ったのですが、今回は当てはまらないのでしょうか?
下記の「Dispose の実装理由」に書かれています。

http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vbcon/html/vbconinitializationterminationofcomponents.asp

引用:

GC.Collect メソッドを毎回呼び出したりしたら余計に高負荷になります。


それは根本的に、じゃんぬねっとさんのご指摘どおり最初に作成して使い回す
方法に同意しております。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-01 12:33
# 本題からどんどん外れていくわけですが...

引用:

マー帽さんの書き込み (2006-02-01 12:09) より:

私が勉強した限りでは違ったのですが、今回は当てはまらないのでしょうか?
下記の「Dispose の実装理由」に書かれています。


Dispose メソッドを実行すると即座に Finalize が呼び出されるなどとは書いてありません。

# Finalize といっても、回収された結果呼び出されるという意味で、
# 即座に回収されませんよね? という意味です。

引用:

Close メソッド後のリソース開放はガベージコレクションが行いますが、
それは Close 後ただちに行われるのではなく、多少なりとも遅延する可能性がありますよね?


もう 1 度書きますが、Close メソッドでも Dispose メソッドでも、
リソースの回収はガベージ コレクションが行います。
どちらも回収のタイミングは、特に何もしなければ GC の気分次第です。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
マー帽
常連さん
会議室デビュー日: 2006/01/31
投稿数: 21
投稿日時: 2006-02-01 12:38
引用:

じゃんぬねっとさんの書き込み (2006-02-01 12:24) より:

もう 1 度書きますが、Close メソッドでも Dispose メソッドでも、
リソースの回収はガベージ コレクションが行います。


確かにどちらもガベージコレクションです。失礼しました。
かるあ
ぬし
会議室デビュー日: 2003/11/16
投稿数: 1190
お住まい・勤務地: センガワ→ムサシノ
投稿日時: 2006-02-01 14:10
例外時のスタックトレースはどうなっていますか?
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2006-02-01 22:16
スレッド趣旨から離れていますが、ちょっと気になったので。

引用:

マー帽さんの書き込み(2006-02-01 07:43)より:

開放漏れではなく、高負荷でガベージコレクションの処理が遅れる事によって
開放が遅延しているのではないかという予想です。
Close メソッド後のリソース開放はガベージコレクションが行いますが、
それは Close 後ただちに行われるのではなく、多少なりとも遅延する可能性がありますよね?

連続して処理するのであれば、遅延するかも知れない開放より
確実に開放してから処理を継続する方が良いように思います。


 Dispose とガーベッジ コレクションは、関係ありません

 Dispose は、アンマネージド リソースの解放を指示します。
 ガーベッジ コレクションは、マネージド リソースのうち、参照されていないものを回収します(全部を回収するわけではない)。

 ただし、IDisposable インターフェイスを実装するクラスは、ファイナライザ(デストラクタ)にて、Dispose を実行することを義務づけられています(コンパイラがチェックするわけではないので、そのような実装になっていないこともある)。したがって、ガーベッジ コレクタがマネージド リソースの回収を行うとき、アンマネージド リソースの回収も行われることを期待できます(実装が保証されているわけではない)。

 Mutex.Close をコールしたからと言って、確かにマネージド リソースの解放は行われません。しかし、アンマネージド リソースの解放は、Close メソッド内で行われます。なぜなら、Mutex クラス(の親である WaitHandle クラス)では IDisposable.Dispose メソッドを明示的に実装して隠していると思われるからです。WaitHandle.Close メソッドの説明には、次のように書かれています。
引用:

このメソッドは IDisposable.Dispose メソッドのパブリック バージョンで、 IDisposable インターフェイスをサポートするために実装されます。


これにより、Close メソッドは、IDisposable.Dispose と等価になるように実装されていると判断できます。


 で、この事例ですが、私は複数のプロセスが、ログ ファイルにアクセスするのではないか、と考えています。その為に Mutex で、ファイルにアクセスするプロセスを1本に絞ろうとしている、と。なので、わざわざ Mutex オブジェクトを作らなくても、FileShare.None で弾けばいいんじゃないか、と。

〆 written by Jitta on 2006/02/01
ya
大ベテラン
会議室デビュー日: 2002/05/03
投稿数: 212
投稿日時: 2006-02-01 23:21
引用:


Dispose は、アンマネージド リソースの解放を指示します。
ガーベッジ コレクションは、マネージド リソースのうち、参照されていないものを回収します(全部を回収するわけではない)。



趣旨から外れますがさらに気になったので。大筋であってると思うんですが、2.0から方向性がちょい変わってます。Disposeはアンマネージリソースの解放だけではなく、汎用の確定的デストラクションのようになってる感じです。C++/CLIのデストラクタとかTransactionScopeとか見てると。

引用:


 で、この事例ですが、私は複数のプロセスが、ログ ファイルにアクセスするのではないか、と考えています。その為に Mutex で、ファイルにアクセスするプロセスを1本に絞ろうとしている、と。なので、わざわざ Mutex オブジェクトを作らなくても、FileShare.None で弾けばいいんじゃないか、と。



私もそう思いますが、弾くんではなく調停(同時にアクセスしない&安全に待つ)を望んでいるでしょうからMutex使うのはありだと踏みます。

どっちにしろスタックトレース待ちかな。現状の情報だと原因が見えない。
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-02-02 02:10
南部です。

念の為、
引用:

yaさんの書き込み (2006-02-01 23:21) より:

2.0から方向性がちょい変わってます。


これは、C++/CLIに関してのみですよね?
C#はもともとusingステートメントによって確定的破棄ができて、
これは、2.0でも同じ方向性である認識です。
#違ってたらドキュメント読み直し、、

スキルアップ/キャリアアップ(JOB@IT)