2012-05-03 5 views
-1

私は単純なASMX Webサービスを使ってコメントを追加できます。追加されるコメントごとに、その行にタイムスタンプを追加します。私が実行している問題は、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; 
    } 
} 

私はこのクラスを推測している私はDateTime.NowTime.Nowのすべてのインスタンスを置き換える場合はすべてが期待どおりに動作しますので、犯人です。

私のTimeクラスがフリーズする原因は何ですか。現在の時刻を要求するときにリフレッシュするとは限りません。

+1

「フリーズ」とはどういう意味ですか?エラーメッセージが表示されるのですか? – DangerMonkey

+1

私は、 'Time.Now'を1秒間隔で2回要求すると、同じ' DateTime'を取得するということです。 – Nosila

+0

あなたはそれを間に処分していますか? – DangerMonkey

答えて

1

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

1

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

関連する問題