-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班级在请求当前时间时冻结而不总是刷新?

4

2 回答 2

1

本质上,静态的东西是你的问题。由于静态变量(或具有静态构造函数的类)保留在内存中的方式,静态方法也会给多线程的东西带来真正的麻烦。使用名为 Now() 的静态函数而不是静态 var 可能会更好。

于 2012-05-03T13:50:57.407 回答
1

仅当您调用 Freeze 或 ResetToDefault 方法之一时,您的类中的 public Now 变量才会更新。访问变量本身只会为您获取最后更新的值。相反,DateTime 的 Now 属性总是返回一个反映当前时间的值。

于 2012-05-03T14:29:17.187 回答