3

私はC#プログラミングに非常に慣れていないので、次のことを念頭に置いてください。

アプリケーションがクラッシュまたはクローズしたときに情報を保存する必要があるデータを含むメモリ内データオブジェクトがあります。これを決定論的または確実に行う方法はありますか?

私はデストラクタを見てきました

~MyObjectName(){}

ファイナライザーとDispose()、

しかし、私が理解している限り、これらのどれも私が望むことを確実に行うことはできませんか?

現在、デストラクタを使用しており、プログラムを閉じているときに機能しますが、これはクラッシュで機能する、または常に機能するという意味ではありません。

イベントも見るべきですか?

4

3 に答える 3

7

プロセス (.Net プロセスだけでなく、任意のプロセス) が終了したときに、データを保存する (またはそのために何か他のことを行う) ために使用できる 100% 信頼できるメカニズムはありません。ほとんどのプロセスは、"タスク マネージャーの [プロセスの終了] オプション。これが発生すると、プロセスはすぐに強制終了されます。より極端な例として、電源コードがマシンの背面から引き出される可能性があります。

プロセスが強制終了された後に、このデータ オブジェクトを最新の状態にして保存する必要が 100% ない場合は、AppDomain.UnhandledException イベントで十分です。

これが絶対に 100% 必要な場合は、プロセスの実行中にこの情報を継続的に保存する必要があります。後でそれを行う機会が得られるという保証はまったくありません。これがデータベースの動作であり、変更の何らかの記録が何らかの形式 (トランザクション ログなど) でディスクに記録されるまで、トランザクションは返されません。これは、ACIDの D の略です。

于 2012-02-17T13:07:46.890 に答える
5

未処理の例外をキャッチしようとしていると思いますか? このようなもの:

static void Main()
{
  Application.EnableVisualStyles();
  Application.SetCompatibleTextRenderingDefault(false);

  Application.ThreadException += new ThreadExceptionEventHandler(Application_ThreadException);
  AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);

  Application.Run(new Form1());
}

static void Application_ThreadException(object sender, ThreadExceptionEventArgs e)
{
  MessageBox.Show(e.Exception.Message, "Unhandled Thread Exception");
  // here you can log the exception ...
}

static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
  MessageBox.Show((e.ExceptionObject as Exception).Message, "Unhandled UI Exception");
  // here you can log the exception ...
}

この例では、try-catch セクション (Windows フォーム アプリケーション) でキャッチされていないすべての例外を管理する方法を示します。

UnhandledException イベントは、メイン UI スレッドからスローされたキャッチされていない例外を処理します。ThreadException イベントは、非 UI スレッドからスローされたキャッチされていない例外を処理します。

于 2012-02-17T11:39:50.037 に答える
1

これはwindbgで実現できます。

  1. windbg の zwterminateprocess メソッドにブレークポイントを保持します。このメソッドは、アプリケーションの終了時に呼び出されます。
  2. ブレークポイントに到達したら、 !dumpheap -type MyObjectName を使用してオブジェクトのアドレスを取得します
  3. !dumpobject "address of MyObjectName" を使用して、オブジェクト内の値を確認します
于 2012-03-23T06:11:24.940 に答える