2012-05-03 23 views
-1

我正在使用一個簡單的ASMX Web服務,該服務使用戶能夠添加註釋。對於添加的每條評論,我都會爲該行添加一個時間戳。我遇到的問題是,如果我將兩個評論相隔1秒,它們都將具有相同的時間戳。而不是在我的代碼中使用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類凍結,並且在請求當前時間時不總是刷新?

+1

「凍結」是什麼意思?它會給你一個錯誤消息還是隻是停止響應? – DangerMonkey

+1

我的意思是,如果我要求'Time.Now'兩次相隔一秒鐘,我會得到相同的'DateTime'。 – Nosila

+0

你把它處理掉了嗎? – DangerMonkey

回答

1

只有當您調用Freeze或ResetToDefault.Accessing變量本身只會爲您提供上次更新的值之一時,纔會更新您的類中的Public Now變量。相反,DateTime的Now屬性總是返回反映當前時間的值。

1

本質上,靜態的東西是你的問題。由於靜態變量(或具有靜態構造函數的類)保留在內存中的方式,靜態方法也可能導致多線程內容的真正頭疼。 您最好使用名爲Now()的靜態函數而不是靜態var。