アプリケーションのシャットダウン中に常に失敗するように見えるファイナライザーがあります。これは、その時点で無効になっているネイティブリソースを保持しているためだと思います。デストラクタ/ファイナライザで、アプリケーションのシャットダウンが原因で呼び出されているかどうかを確認する方法はありますか?
ありがとう!
アプリケーションのシャットダウン中に常に失敗するように見えるファイナライザーがあります。これは、その時点で無効になっているネイティブリソースを保持しているためだと思います。デストラクタ/ファイナライザで、アプリケーションのシャットダウンが原因で呼び出されているかどうかを確認する方法はありますか?
ありがとう!
System.Environment.HasShutdownStarted
ここのドキュメント:http://msdn.microsoft.com/en-us/library/system.environment.hasshutdownstarted.aspx
私はそれAppDomain.IsFinalizingForUnload()
がこの情報を提供すると思います。
それらがすでに他の方法で処分されている場合、本当にファイナライザーでそれらを処分する必要がありますか?
またはその逆:IDisposableパターンを介してそれらを破棄することはできませんか?
アプリの存続期間中保持しているリソースであっても、次のものを使用することができます。
static void Main()
{
using(var yourResource = ...)
{
...
yourMainForm.YourResource = yourResource;
Application.Run...
}
}
編集:いくつかの興味深い答え[1]は別として、これは全体に何か問題があるように聞こえます。
リソースがすでに廃棄されているためにファイナライザーが失敗した場合は、どこかに問題があります。
このリソースを適切に廃棄することが重要な場合は、これを適切に行う必要があります。
「UIのどこかで参照されている」だけで十分かどうかはわかりません。これがフォームかそこらで行われたとしても、正しく理解するのはそれほど難しいことではありません。フォーム、コンポーネント、またはコントローラーのdisposeをオーバーライドして、決定論的に実行できます。
[1]いつか噛まれたら重宝するかも…。