2012-07-17 17 views
6

私のクラスの1つは、アプリケーションの実行中に統計を収集し、アプリケーションの終了時にこの統計をディスクに保存します。アプリケーションシャットダウン時に情報をファイルに保存するための正しい方法

~Strategy() 
    { 
     foreach(var item in statisticItems) 
     { 
      log.WriteLine(item.Text); // log is AutoFlush 
     } 
    } 

ときデストラクタ私はデバッガの瞬間に私が見ても、私はできない「キャッチ」を期待したログが表示されないしかし:私はそのようなファイルにログを保存しようとしたので、私は私のプログラム内でこのクラスを破壊することはありませんと呼ばれる。

質問:

  • デバッガでは、私は、デストラクタが呼ばれた瞬間をキャッチできないのはなぜ?プログラムの終了時にすべてのオブジェクトに対してデストラクタを呼び出す必要はありませんか?
  • 自分のものをログに記録するにはどうすればよいですか?
+0

万一、停止ボタンでデバッガをシャットダウンしていませんか? – Blindy

+0

@Blindyいいえ私はちょうどウィンドウを閉じる – javapowered

+0

'戦略'はインスタンス化されていますか?静的クラスですか(静的メソッドのみを使用していますか?)私たちに多くの情報、ユースケース、可能なものを与えてください。問題のフレームワークのバグを割り引くことができます。これはコード内の何かであり、この時点でしか推測できません。 – Blindy

答えて

1

デストラクタ(またはファイナライザ)は、そのようなコードを置く場所ではありません。管理されていないリソースを解放するために設計されています。デストラクタは非決定論的に呼ばれます。したがって、デストラクタ内で有効なオブジェクトに依存することはできません。非常に特殊な状況下では、別のスレッドで呼び出されるため、デバッガでキャッチできません。要するに、必要があるとわからない限り、デストラクタは使用しないでください。

アプリケーションシャットダウンを記録する理想的な方法は、ログコードをMainメソッドの最後に置くことです。スローされた例外を捕捉してログに記録しておき、その場合は、Mainの最後にシャットダウンを記録することができます。

スタックオーバフローなどのエラーが原因で、シャットダウンをログに記録できない場合があります。そのような場合は、エラーの前に起こったことのログに依存する必要があります。

+0

良いアドバイスをしているうちに、実際の質問には答えられません。 – Blindy

+0

「私のものを記録するにはどうしたらいいですか? –

+0

これはもう一つの問題にも対処しました。 –

-1

デストラクタに依存しないでください。

[STAThread] 
static void Main() 
{ 
    using(new Strategy()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 
} 

public class Strategy : IDisposable 
{ 
    public void Dispose() 
    { 
     WriteLogs() 
    } 
    ... 
} 

このようにして、ログが書き込まれることを確認します。

静的void Mainは、Windowsフォームアプリケーションの作成時に作成されるデフォルトのprogram.csからコピーされます。

+0

-1を参照してください。あなたはこの1つを混乱させるべきではありません、実際の取引を使用してください。 – Blindy

+0

なぜCOM afaikに属する 'STAThread'属性を使用していますか?なぜ私はデストラクタに頼らなければならないのですか? – javapowered

+0

'Disposable'はデストラクタの最適化です(とにかく適切なパターンにはデストラクタが含まれています)。その主な利点は、必要に応じてリソースを解放できることです。 – Blindy

-1

はこれがない完全な答え(まだ)ですが、これをチェックアウト:

プログラマは、これがガベージコレクタによって決定されるので、デストラクタが と呼ばれたときを制御することはできません。ガベージ コレクタは、 アプリケーションでもはや使用されていないオブジェクトをチェックします。破棄対象のオブジェクトを考慮すると、 はデストラクター(存在する場合)を呼び出し、 オブジェクトを格納するために使用されたメモリを再要求します。デストラクタは、プログラムが終了するときにも呼び出されます。

出典:それはコンソールアプリならMSDN

、あなたは何が起こるかを見るためにEnvironment.Exit(0);を呼び出して試みることができますか?

これは興味深い質問ですので、この回答を更新しておきましょう。誰でも自由に編集できます。

よろしく

+0

wikiスタイルの回答が必要な場合は、コミュニティwikiの回答が必要です。 –

+0

@KendallFreyあなたが編集したくなければ、あなたはする必要はありません。それでも、私はOPに質問をして、答えを改善するためにフィードバックを待っています。 "あなたが間違っている、このようにするべきだ"というだけのことよりも良い。 –

+0

コメントは、OPの質問をする場所です。答えは答えです。 –

関連する問題