1

ログファイルに書き込もうとすると、ローカルのテスト サーバーがクラッシュします。私はこれを ASP.NET ページに使用しています。分離コードは C# です。

構造:

/
 Functions.cs
 index.aspx
 index.aspx.cs

負荷Functionsとしてのインスタンスを作成します。index.aspxではFunctions、ロギング用の関数を定義します。この関数は、から呼び出されindex.aspx.cs、次のようになります。

if (_WriterOpen == false)
{
    _Writer = new StreamWriter(_WorkingDir + _Logfile, true);
    _WriterOpen = true;
    _Writer.AutoFlush = true;
}
_Writer.WriteLine(DateTime.Now.ToString() + ": " + String.Format(Note, Args));

_Writerクラスに対してグローバルに定義されており、ご覧のとおり、StreamWriter が含まれています。クラス自体には、ファイルへの接続を閉じるためのデストラクタがあります。

~Functions()
{
    _Writer.Flush();
    _Writer.Close();
    _Writer.Dispose();
}

そのため、ページを開くとログが書き込まれますが、サーバーがクラッシュします。したがって、問題はデストラクターのどこかにあると思いますが、理由がわかりません...

4

5 に答える 5

3

デストラクタは必要ありません。StreamWriter には既に独自のものがあります。

デストラクタはガベージ コレクタによって呼び出されるため、デストラクタから他のオブジェクトにアクセスしないでください。他のオブジェクトは判別不能な状態にあります。いつ呼び出されるか、どのスレッドで呼び出されるかはわかりません。絶対に、絶対に、絶対にデストラクタを作成しないでください。ほとんどの場合、それは悪い考えです。

クリーンアップ コードを Unload イベントに配置できます。 ASP.NET ページのライフ サイクルを参照してください。

于 2009-11-19T10:41:57.417 に答える
1

まず、close と dispose の両方を呼び出す必要はありません。MSDN からのリンクを参照してください: リンク テキスト

この Close の実装は、真の値を渡す Dispose メソッドを呼び出します。

Close を呼び出して、すべてのデータが基になるストリームに正しく書き出されるようにする必要があります。Close の呼び出しに続いて、StreamWriter に対するすべての操作で例外が発生する可能性があります。ディスクに十分なスペースがない場合、Close を呼び出すと例外が発生します。

于 2009-11-19T10:41:59.210 に答える
1

これは、再帰呼び出しによって引き起こされたスタック オーバーフロー エラーである可能性が最も高いようです。

エラーをログに記録していますか、それはエラーを引き起こしていますか、それはログに記録しており、...などを引き起こしています。

Visual Studio からデバッグ モードで実行できますか?

于 2009-11-19T10:36:34.497 に答える
1

dispose 呼び出しを自動的に呼び出すusingステートメントをお勧めします。あなたの目的のために、コードは次のようになります。

StreamWriter _Writer;

using(_Writer)
{
    if (_WriterOpen == false)
    {
       _Writer = new StreamWriter(_WorkingDir + _Logfile, true);
       _WriterOpen = true;
       _Writer.AutoFlush = true;
    }
    _Writer.WriteLine(DateTime.Now.ToString() + ": " + String.Format(Note, Args));
}

私はこれをテストしていないことに注意してください。確認後、必要に応じて更新します

次の 2 つの記事も参照してください。
第 1
条 第 2 条

于 2009-11-19T11:09:06.223 に答える
0

デバッガーで実行できない場合は、失敗しなくなるまで関数の行をコメントアウトしてみてください。これで手がかりが得られるはずです。

ガベージ コレクターは不確定な時点でデストラクタを呼び出すため、通常のクラッシュが発生している場合は、おそらくデストラクタではありません。

クラスを IDisposable から継承し、そこにクリーンアップ コードを配置することをお勧めします。破棄パターンを使用してください:こちら

于 2009-11-19T10:54:44.803 に答える