【发布时间】:2017-11-30 17:02:33
【问题描述】:
什么被认为是跟踪例如的良好做法?在进行串行通信的应用程序中收到消息的时间戳?
假设应用程序每秒在串行端口上接收流式消息 20 次。并且您想跟踪收到的消息的时间戳。一种方法可能是这样的:
public class SerialPortHandler {
private DateTime _rxTimestamp;
private SerialPort_DataReceived(object sender, SerialDataReceivedEventArgs e) {
_rxTimestamp = DateTime.Now;
// Collect bytes in RX buffer and do stuff...
}
}
但是,每次接收到数据时,_rxTimestamp 将被设置为 DateTime 对象的新实例。我知道 C# 有垃圾收集,可以处理内存中未引用的对象。但是这种方式是否完全符合良好的 OOP 实践,或者在计算机资源方面是否会被认为是浪费?
【问题讨论】:
-
你想用时间戳做什么?
-
@abto 这有关系吗?但是为了争论,假设我正在做异步通信,并且需要检查是否在给定的时间限制内收到了消息。
-
没有任何垃圾收集实例(它是一种值类型),但这里 IMO 的要点是准确性(您没有纯日期时间)和 UTC(您当时没有使用切换到/从 DST 切换时,您将有跳跃/孔)。每秒 20 次处于系统时间的边缘。您可以将它与秒表一起用作参考(UTC 时间!)
-
如果你想用时间戳记录每个请求,那么它没有实际意义。实际上,如何您设法持久化日志更多的是(I/O)瓶颈恕我直言 - 例如我是每秒“写入某个持久层”20 次(还是“批量”)?
-
@Oystein 如果只是为了跟踪数据,通常的方法是使用递增的 Id,例如使用
Interlocked递增的Int32以确保线程安全。至于“每 50 毫秒覆盖一个对象”——这完全没有问题。