- - PR -
COM参照を確実に解放するコードの可読性をあげたい
«前のページへ
1|2|3|4
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-03-16 18:23
南部です。
こまめにReleaseComObjectを実行していても異常終了時にリークするのは同じでは? 確率は違うでしょうけど、、、 #異常終了後のアプリケーションの安定性、、、かな? #でも異常終了してるしな、、そこに労力をかけるべきか、、、
ありがとうございました。 | ||||||||||||
|
投稿日時: 2006-03-16 19:37
そうです、参照が残っている時間が長ければ長いほど確率が増えます。 使っていないのであれば、一刻も早くプロセスごと解放したいものです。
確かに CLR すら検知できないような異常時だけになりますから、 そう言われるとちょっと強く言えない部分はあります。(;^-^) 可読性も重視したくなる気持ちも十分に理解できます。 ファイナライザがいつ起きるかわからないというのが大きいのと、 CLR が管理しきれないのであれば、自分で管理するべきに尽きると思います。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2006-03-16 20:12
nanbuさんのコードをちょこっとだけ改造して、動かしてみました。
Windowsアプリケーションだと、全然問題なしですね。 タスクマネージャをのぞいてみると、ボタンを押すごとにEXCEL.EXEのプロセスが増えていきますが、 ×ボタンでアプリを終了すると、全てのプロセスが消えてくれます。 GC.Collect()のコメントを外したら、ボタン押すごとにプロセスが消えるようになりました。 試しに、全く同じコードをASP.NET Webアプリケーションでも動かしてみたのですが、 なぜか1回目の実行でいきなりEXCEL.EXEが不正なメモリを参照したという赤ダイアログが出て、 その後ボタンを押してもレスポンスが帰ってこない、IISを再起動してもEXCEL.EXEのプロセスは消えず、 タスクマネージャからも殺せず、OSを再起動するハメになるという悲惨な結果に...orz Microsoftが推奨しないのがよくわかります(^^; | ||||||||||||
|
投稿日時: 2006-03-16 22:23
はい、もちろんアンマネージリソースの生存期間は短いに 越したことはないですね。 ただやはり可読性を考えると、オートメーションの処理 〜 GC.Correct() の生存期間は許容範囲かなぁ、、、
、、、無念。 | ||||||||||||
|
投稿日時: 2006-03-17 00:24
それも場合によりけりです。 よく例に出てくる Excel のオートメーションの場合、「最後の参照」が解放されるまで、アウトプロセスサーバである EXCEL.exe が居残ってしまなど、様々な弊害が考えられます。 _________________ // 渋木宏明 (Hiroaki SHIBUKI) // http://hidori.jp/ // Microsoft MVP for Visual C# // // @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/ | ||||||||||||
|
投稿日時: 2006-03-19 00:38
いえ、もちろん、「最後の参照」が残っていないことが前提です。 でないとGC.Correct()する意味ないですから。 なので、 Excel.Application.Quit() 〜 ReleaseComObject()と Excel.Application.Quit() 〜 参照解放 〜 GC.Correct()では アウトプロセスの生存期間は大差ないです。 私が許容範囲と言ったのは、 オートメーション処理で使用したSheetやRangeのすべての参照が 参照解放 〜 GC.Correct()まで解放されないことに対してです。 |
«前のページへ
1|2|3|4