2012-03-28 6 views
2

VB.NETまたはC#または他の.NET開発者の場合は気にしません。どの言語であっても答えは高く評価されます。本当にアイデアを探してい...アプリケーションのDispose()メソッドを使用せずにアプリケーションが閉じられた/破棄されたときにFACTORYクラスのメソッドを呼び出す

私は次のようなファクトリクラスを持っている:

Public Class MyFactory 
    Public Shared theStuffICreated as List(Of Stuff) 
    Public Shared/Static Sub Create(...) 
     ... 
    End Sub 

    Public Shared/Static Sub ThingsToDoWhenClassIsDestroyed() 
     ... 
    End Sub 
End Class 

どのように私は、このクラスは、ファイナライザで「破壊」されたときにThingsToDoWhenClassIsDestroyed()が呼び出されることを確認することができます。私はすべてが共有/静的なので実際には作成されていないが、破壊される必要がある場所の足跡はないと理解していますか?このクラスを複数のGUIアプリケーションおよびコンソールアプリケーションで使用できると仮定し、各GUIのDisposeメソッドでMyFactory.ThingsToDoWhenClassIsDestroyed()を呼び出すことは現実的ではありません。何か案は?

+0

あなたは 'Stuff'をクリーンアップする方法を尋ねていますか? 'MyFactory'が共有クラスである場合、インスタンスは存在しないため、オブジェクトの存続期間は存在しない可能性があるからです。 –

+0

私はあなたの質問を本当に理解しているかどうかはわかりませんが、多分AppDomainクラスのDomainUnloadイベントを使うことができます。 – schglurps

+0

@schglurps:これは良いアイデアでした。それがうまくいくならば完璧な解決策でしたが、うまくいかなかったでしょう。このメソッドは決してトリガーしません。 AppDomain.DomainUnloadに類似したものは何ですか? – Denis

答えて

0

Application.ApplicationExitは良いスタートでした。 AppDomain.CurrentDomain.UnloadDomainも良いスタートでしたが、どちらもいつも働いていませんでした。 Application.ApplicationExitはGUIアプリケーションでは動作しますが、コンソールアプリケーションでは動作しません。私はAppDomain.CurrentDomain.ProcessExitを使用して終了しました。これはすべてに対して機能するからです。だから私のコードは次のようになります:

Public Class MyFactory 
    Public Shared/Static theStuffICreated as List(Of Stuff) 
    Shared/Static Sub New() 
     AddHandler AppDomain.CurrentDomain.ProcessExit, AddressOf ApplicationExitHandler 
    End Sub 

    Public Shared/Static Sub ApplicationExitHandler(ByVal s As Object, e As EventArgs) 
     RemoveHandler AppDomain.CurrentDomain.ProcessExit, AddressOf ApplicationExitHandler 
     ThingsToDoWhenClassIsDestroyed() 
    End Sub 

    Public Shared/Static Sub Create(...) 
     ... 
    End Sub 

    Public Shared/Static Sub ThingsToDoWhenClassIsDestroyed() 
     ... 
    End Sub 

End Class 
1

あなたが述べているように、このクラスのインスタンスは決して存在しないので、ファイナライザは何もしません。

イベントはApplication.Exitにすることができます。しかし、アプリケーションのDispose()メソッド(それが何であれ)を避ける方法とは大きく異なっているかどうかは不明です。しかし少なくとも、コード内からこのイベントに結びつけることができるので、クリーンアップは完全に自己完結型です。だから、あなたは、静的なすべてのあなたのシングルトンのロジックを維持しますが、静的コンストラクタでクラスのインスタンスを作成し、ファイナライザであなたのクリーンアップ呼び出すことができます

public class MyFactory 
{ 
    static private MyFactory _factory; 

    static MyFactory() 
    { 
     _factory = new MyFactory(); 
    } 

    ~MyFactory() 
    { 
     // Do Cleanup 
    } 
} 

は別のようないくつかのハッキングがありますこれは、静的クラスがスコープから外れると(つまり、アプリケーションの最後で)呼び出されるだけです。

編集:この時点で電子メールを送信し、データベースを更新することをコメントに記載しています。 CLRがヒープ上の最後のオブジェクトをファイナライズするまでには、このようなことをするのが遅すぎると思います。つまり、Application.Exitなどのイベントを使用することに戻ります。

+0

多分アプリケーションが終了していることを示す何らかのイベントです。 – Denis

+0

Application.Exit then ... –

+0

あなたが知っている、Application.Exitのトリックは機能しているようです。 AddHandler Application.ApplicationExit、AddressOf ApplicationExitHandlerをShared Sub New()に追加しました。 – Denis

関連する問題