每 1 秒使用秒表计时器与 DateTime 比较?
Using Stopwatch timer versus DateTime comparisons every 1 second?
假设我们有一个专用的 OS 线程,它必须每 4.30 分钟执行一次操作。
你不能挂起线程,因为它需要check/do其他东西,你也不能使用await/async,因为那会导致命令退出专用OS线程,违背了第一个创建线程的目的。
为了解决上述问题,我找到了 2 个解决方案:
- 使用
System.Diagnostics.Stopwatch
启动一个新的 Stopwatch
对象,如果达到所需的时间范围,则每 1 秒比较一次:if (timer.ElapsedMilliseconds == 258000) { ...}
- 使用
System.DateTime
初始化一个DateTime
对象DateTime.UtcNow.AddMinutes(4.30)
并每1秒将其与当前日期进行比较:if (DateTime.UtcNow >= initializedDate) { ... }
第一种方法使用 Stopwatch
。我认为 Stopwatch 使用线程来完成所有工作,这就是我想避免它的原因?
第二种方法使用了很多 DateTime
对象。每 1 秒我们就会构建一个当前日期的新 DateTime
对象。
这两个解决方案是等效的,除非您需要非常高的精度:Stopwatch
将使用高精度系统计时器(如果可用),如果不可用则回退到 DateTime
。为了解决您的问题:
Stopwatch
不使用单独的线程。它只是读取系统刻度(高精度或低精度)并为您做一些数学运算。
DateTime
是一个结构,因此每秒创建一个新实例应该很便宜并且对 GC 施加零压力。
我会使用 Stopwatch
,因为它可以免费提供经过的时间。 :)
假设我们有一个专用的 OS 线程,它必须每 4.30 分钟执行一次操作。
你不能挂起线程,因为它需要check/do其他东西,你也不能使用await/async,因为那会导致命令退出专用OS线程,违背了第一个创建线程的目的。
为了解决上述问题,我找到了 2 个解决方案:
- 使用
System.Diagnostics.Stopwatch
启动一个新的Stopwatch
对象,如果达到所需的时间范围,则每 1 秒比较一次:if (timer.ElapsedMilliseconds == 258000) { ...}
- 使用
System.DateTime
初始化一个DateTime
对象DateTime.UtcNow.AddMinutes(4.30)
并每1秒将其与当前日期进行比较:if (DateTime.UtcNow >= initializedDate) { ... }
第一种方法使用 Stopwatch
。我认为 Stopwatch 使用线程来完成所有工作,这就是我想避免它的原因?
第二种方法使用了很多 DateTime
对象。每 1 秒我们就会构建一个当前日期的新 DateTime
对象。
这两个解决方案是等效的,除非您需要非常高的精度:Stopwatch
将使用高精度系统计时器(如果可用),如果不可用则回退到 DateTime
。为了解决您的问题:
Stopwatch
不使用单独的线程。它只是读取系统刻度(高精度或低精度)并为您做一些数学运算。DateTime
是一个结构,因此每秒创建一个新实例应该很便宜并且对 GC 施加零压力。
我会使用 Stopwatch
,因为它可以免费提供经过的时间。 :)