-1

私は、ユーザーがコメントを追加できるようにする単純なASMXWebサービスを使用しています。追加されるコメントごとに、行にタイムスタンプを追加します。私が直面している問題は、1秒間隔で2つのコメントを追加すると、両方のタイムスタンプが同じになるということです。コードで使用する代わりにDateTime.Now、静的クラスを使用して、単体テストを簡単に記述できるようにします。

これが私のTimeクラスです:

public class Time : IDisposable
{
    public static DateTime Now;

    static Time()
    {
        ResetToDefault();
    }

    public static IDisposable Freeze(DateTime dateTimeToFreeze)
    {
        Now = dateTimeToFreeze;

        return new Time();
    }

    void IDisposable.Dispose()
    {
        ResetToDefault();
    }

    private static void ResetToDefault()
    {
        Now = DateTime.Now;
    }
}

Time.Nowのすべてのインスタンスをすべてに置き換えると期待どおりに機能するため、このクラスが原因だと思いますDateTime.Now

Time現在の時刻をリクエストすると、クラスがフリーズし、常に更新されない原因は何ですか?

4

2 に答える 2

1

クラスの public Now 変数は、メソッド Freeze または ResetToDefault のいずれかを呼び出したときにのみ更新されます。変数自体にアクセスすると、最後に更新された値が取得されます。対照的に、DateTime の Now プロパティは、常に現在の時刻を反映した値を返します。

于 2012-05-03T14:29:17.187 に答える
1

基本的に、静的なものが問題です。静的メソッドは、静的 var (または静的コンストラクターを持つクラス) がメモリ内に残る方法のために、マルチスレッドのものにとっても頭痛の種になる可能性があります。静的 var の代わりに Now() という名前の静的関数を使用する方がよい場合があります。

于 2012-05-03T13:50:57.407 に答える