好的,我有一个相当简单的问题,我找不到简明的答案。我想知道我是否需要担心在lock()
仍在运行时读取Stopwatch
的已用属性时调用Stopwatch
语句。
同样是DispatchTimer
我应该用来衡量一个线程的运行时间。我读过其他类似的问题,可以使用 class foo
{
private bool _isRunning { get; set; }
private Stopwatch sw { get; set; }
public void StartThread()
{
this._isRunning = true;
new Thread(new ThreadStart(this.DoWork)).Start();
this.sw.Restart();
}
public void StopThread()
{
this._isRunning = false;
this.sw.Stop();
}
private void DoWork()
{
while(this._isRunning)
{
//Do Stuff
}
}
public TimeSpan GetRuntime()
{
return this.sw.Elapsed;
}
public foo()
{
_isRunning = false;
sw = new Stopwatch();
}
}
。我也研究过使用事件,但是对于这么简单的事情来说,这似乎是一个很大的开销,请告诉我,如果这是完全错误的,我应该使用事件。一些简单的代码来说明我在说什么。
GetRuntime()
在使用上述类的应用程序中说我在停止Stopwatch
之前从另一个线程调用lock()
我是否需要添加Stopwatch
语句以确保我得到正确的数据,我不会阻止lock()
继续运行。或者我认为它不需要{{1}}并且会很好。
我确实理解你理论上可以运行尽可能多的读取,我只是很好奇,因为如果改变了事情,那么经常会写入Elapsed属性后备存储。我已经阅读了很多关于线程安全的信息,但我只是在寻找澄清和确认,我确实正在考虑这个问题。
答案 0 :(得分:4)
关于秒表的MSDN documentation州,“不保证任何实例成员都是线程安全的。”请注意,这里肯定存在一个理论上的漏洞,因为它在内部使用“长”滴答计数并且在32位处理器上更新长时间不是原子操作。您可能会看到部分更新(因此已损坏)的值。在Ticks碰巧超过32位边界之前你可能不会注意到,此时你可能会遇到一个非常意外的罕见错误(你可能会读取Int32.MaxValue,然后是0,然后是Int32.MaxValue + 1,如果你在错误的时刻查询它,会产生非常大的经过时间差异。)