让我们假设我们使用Stopwatch
public void DoWork()
{
var timer = Stopwatch.StartNew();
// some hard work
Logger.Log("Time elapsed: {0}", timer.Elapsed);
timer.Stop(); // Do I need to call this?
}
根据MSDN:
在典型的秒表场景中,您调用Start方法,然后最终调用Stop方法,然后使用Elapsed属性检查已用时间。
当我不再对定时器实例感兴趣时,我不确定是否应该调用此方法。我应该使用Stop
方法“清理”吗?
修改
请记住,Logger.Log(..)不需要任何费用,因为在记录器日志之前,timer.Elapsed
被读取。
答案 0 :(得分:54)
不,你不需要阻止它。 Stop()
只是停止跟踪已用时间。它没有释放任何资源
答案 1 :(得分:22)
不,没有必要停止或清理它。
Stopwatch
不使用任何非托管资源(如果您考虑IDisposable
)。它实际上根本不使用任何资源(当然,除了对象本身使用的内存)!
在.NET(完整的.NET Framework,Mono,.NET Core)的Windows实现中,它只在需要时调用QueryPerformanceCounter()
Windows API(在Start()
和Stop()
以及何时阅读Elapsed
)以检索高分辨率时间戳。
在Mono和.NET Core的Linux实现中,它使用clock_gettime
函数来检索单调递增时间值。
对任何对实施细节有好奇心的人:阅读this post。
答案 2 :(得分:3)
如果您想重复使用Elapsed值,我认为Stop很有用。
答案 3 :(得分:0)
如果不需要计算代码,则无需使用Stop()。
答案 4 :(得分:-2)
你应该在获得经过时间之前停止秒表
static void Main()
{
// Create new stopwatch
Stopwatch stopwatch = new Stopwatch();
// Begin timing
stopwatch.Start();
// Do something
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(1);
}
// Stop timing
stopwatch.Stop();
// Write result
Console.WriteLine("Time elapsed: {0}",
stopwatch.Elapsed);
}
答案 5 :(得分:-2)
//disposable StopWatch
internal class StopWatch :Stopwatch, IDisposable
{
public StopWatch()
{
Start();
}
private string _name;
public string Name
{
get => _name;
set => _name = $"{value} ";
}
public void Dispose()
{
Stop();
Debug.Print(string.Format("{0}RunTime {1:00}:{2:00}:{3:00}.{4:00}", Name, Elapsed.Hours, Elapsed.Minutes,Elapsed.Seconds, Elapsed.Milliseconds / 10));
}
}
//Use example
internal class SomeClass
{
private static void Some()
{
using (var stopWatch = new StopWatch())
{
// Do something
for (int i = 0; i < 1000; i++)
{
Thread.Sleep(1);
}
}
}
}