2

アプリケーションの存続期間全体で必要な場合、StreamWriter をどこに配置すればよいですか? デストラクタで破棄しますが、うまくいきますか? AutoFlushデータをフラッシュするために処分する必要があり、msdn からの機能を使用したくありません。"You can get better performance by setting AutoFlush to false, assuming that you always call Close (or at least Flush) when you're done writing with a StreamWriter."

それで、私Disposeは以下のコードのようにデストラクタに入れるべきですか?

class Log
{
    private static StreamWriter swLog = new StreamWriter("logMAIN.txt");

    static ~Log()
    {
        swLog.Dispose();
    }

    public static void Push(LogItemType type, string message)
    {
        swLog.WriteLine(type + " " + DateTime.Now.TimeOfDay + " " + message);
    }
}

Disposeiの代わりにupdCloseを呼び出すつもりでしたが、まったく同じことをしているように見えるため、この場合は重要ではありません。

4

2 に答える 2

2

MSDN からのパフォーマンス情報をフラッシュしないという決定に基づいているようです。それは私が始めるところではありません。

AutoFlush を使用すると重大なパフォーマンスの問題が発生するという証拠はありますか?

StreamWriterこれらのパフォーマンスの問題を別の方法で軽減することを検討しましたか。たとえば、自動フラッシュまたは 20 秒ごとの定期的なフラッシュなど、単一のスレッドで に書き込みますか?

あなたが作成しているアプリケーションの種類を教えてくれなかったことに注意してください。これは、シャットダウンについてどれだけ知っているかという点で大きな違いを生む可能性があります。

また、指定したコードは最初からスレッドセーフではないことに注意してください。StreamWriter複数のスレッドから同時に使用することになる可能性があります。StreamWriterそれがそのシナリオのために特別に設計されているとは思えません。

于 2012-05-24T16:00:25.717 に答える
0

問題は、 のStreamWriter初期化方法です。このような通常のオブジェクトを使用する

using (var logger = new Log())
{
    app.Run();
}

StreamWriter引き続きLogクラス内の静的フィールドにすることができますが、静的初期化子を使用するのではなく、既知の時点で初期化および破棄されます。

これを機能させるには、クラスをログに記録してIDisposableインターフェイスを実装し、次のようStreamWriterDisposeメソッドで破棄する必要があります。

class Log: IDisposable
{
    private static StreamWriter swLog;

    public Log()
    {
       swLog = new StreamWriter("logMAIN.txt");
    }

    public void Dispose()
    {
        swLog.Dispose();
    }

    public static void Push(LogItemType type, string message)
    {
        swLog.WriteLine(type + " " + DateTime.Now.TimeOfDay + " " + message);
    }
}

Logまた、例外がスローされた場合でも がどのように破棄されるかにも注意してください。

于 2012-05-24T15:59:24.990 に答える