- PR -

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

投稿者投稿内容
nanbu
大ベテラン
会議室デビュー日: 2004/08/19
投稿数: 178
投稿日時: 2006-01-31 22:09
引用:

未記入さんの書き込み (2006-01-31 10:16) より:

2.例外はログ出力をするstaticメソッド内で、
Mutexオブジェクトをnewする際に例が発生しています。

//排他制御 → 【ここで例外が発生します】
Mutex objMutex = new Mutex(bolOwnership, strLogName, out bolCreatedNew);



ほんとにここ?ほんとにNULL参照?
うーん、ふしぎ、、、
#pdbが最新になってないってオチじゃないよね?
マー帽
常連さん
会議室デビュー日: 2006/01/31
投稿数: 21
投稿日時: 2006-01-31 23:16
初めまして、マー帽と申します。


usingを使用してみては如何でしょうか?

私はまだ使用した事がありませんが、
ステートメントの終了時に Dispose メソッドを呼び出してくれるようです。
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-31 23:24
引用:

nanbuさんの書き込み (2006-01-31 22:09) より:

ほんとにここ?ほんとにNULL参照?
うーん、ふしぎ、、、
#pdbが最新になってないってオチじゃないよね?


デバッグ情報が最新でも不安定な状態だと、正しい位置で中断しないことがあります。
そんなわけで、とりあえず、スタック トレースが欲しくなって参りました。(^-^;)

# 確かにここでは起きえない。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-01-31 23:25
引用:

マー帽さんの書き込み (2006-01-31 23:16) より:

usingを使用してみては如何でしょうか?
私はまだ使用した事がありませんが、
ステートメントの終了時に Dispose メソッドを呼び出してくれるようです。


今回のとは関係がないと思われます。
例外が起きた後の話ではないですので。

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

じゃんぬねっとさんの書き込み (2006-01-31 23:25) より:

今回のとは関係がないと思われます。
例外が起きた後の話ではないですので。




最近C#を始めたばかりで、じゃんぬねっとさんの投稿は
いつも参考にさせていただいております。

確かにusingがどうかという問題ではありませんが、
高負荷の時に発生するのであればガベージコレクションの動作が関係しているのではと考えて、
明示的にDisposeすれば解決するのではないかと思っています。
マー帽
常連さん
会議室デビュー日: 2006/01/31
投稿数: 21
投稿日時: 2006-02-01 00:10
引用:

高負荷の時に発生するのであればガベージコレクションの動作が関係しているのではと考えて、
明示的にDisposeすれば解決するのではないかと思っています。


説明不足ですので補足いたします。

勉強したての素人考えですが、
例外が発生した時の問題ではなく、問題が発生するまでの4000回のインスタンスの作成時に
高負荷のためにリソースを開放できず、不具合が発生しているのではないかと考えています。
明示的にDisposeし、確実にリソースを開放すれば良いのではないでしょうか?


[ メッセージ編集済み 編集者: マー帽 編集日時 2006-02-01 00:13 ]
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2006-02-01 01:24
引用:

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

例外が発生した時の問題ではなく、問題が発生するまでの4000回のインスタンスの作成時に
高負荷のためにリソースを開放できず、不具合が発生しているのではないかと考えています。


今回、解放漏れはあまり考えられません。
Mutex は確かに IDisposable を実装していますが、Dispose は protected メソッドです。
非公開であるため、Close メソッドと等価 (または十分) であることを示します。

引用:

明示的にDisposeし、確実にリソースを開放すれば良いのではないでしょうか?


finally 句で Close なされているため、"確実" は確実でしょう。
まあ、using ステートメントを使うべきという点では同意です。

それにしても、4000 件も処理するとわかっていながら、毎回 Mutex を生成するんですかね...
最初と最後だけで良いような気がしますし、Mutex の使いどころではないです。

どちらにしても、コメントアウトするなりして検証しない限りは前には進めません。

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

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

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

例外が発生した時の問題ではなく、問題が発生するまでの4000回のインスタンスの作成時に
高負荷のためにリソースを開放できず、不具合が発生しているのではないかと考えています。


今回、解放漏れはあまり考えられません。
Mutex は確かに IDisposable を実装していますが、Dispose は protected メソッドです。
非公開であるため、Close メソッドと等価 (または十分) であることを示します。


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

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


[ メッセージ編集済み 編集者: マー帽 編集日時 2006-02-01 08:04 ]

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