我正在使用一个简单的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
类冻结的原因是什么并且在请求当前时间时并不总是刷新?
答案 0 :(得分:1)
基本上,静态的东西是你的问题。静态方法也会导致多线程内容的真正麻烦,因为静态变量(或具有静态构造函数的类)保留在内存中的方式。 最好使用名为Now()的静态函数而不是静态var。
答案 1 :(得分:1)
只有在调用Freeze或ResetToDefault方法之一时,才会更新类中的public Now变量。访问变量本身只会获得最后更新的值。相反,DateTime的Now属性始终返回反映当前时间的值。