请求日期时间时冻结的自定义时间类

时间:2012-05-03 13:21:08

标签: c# web-services asmx

我正在使用一个简单的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类冻结的原因是什么并且在请求当前时间时并不总是刷新?

2 个答案:

答案 0 :(得分:1)

基本上,静态的东西是你的问题。静态方法也会导致多线程内容的真正麻烦,因为静态变量(或具有静态构造函数的类)保留在内存中的方式。 最好使用名为Now()的静态函数而不是静态var。

答案 1 :(得分:1)

只有在调用Freeze或ResetToDefault方法之一时,才会更新类中的public Now变量。访问变量本身只会获得最后更新的值。相反,DateTime的Now属性始终返回反映当前时间的值。