我正在编写一个应用程序,我需要在其中跟踪完成了多少操作以及完成了何种操作。完成所有操作后,此数据将发布到 API。该 API 存储数据,公司可以利用这些数据向用户收取应用程序完成的工作量。
下面的代码是我的代码的真正简化实现:
TicksCounter counter = new TicksCounter();
foreach(var work in workload)
{
//do some work
if(workTypeA)
counter.IncrementTypeA();
else if(workTypB)
counter.IncrementTypeB();
}
ApiClient.PostTicks(counter);
TicksCounter 类在内部处理跨线程访问和一些其他问题。我的代码工作正常。
但是我的问题是我无法找到一种保护内容的好方法,TicksCounter
以防应用程序崩溃或 API 不可用。
如果 API 不可用,我想建立一种情况来保存计数器的内容。然后每隔一段时间,我会尝试继续将内容发布到 API。当 API 再次可用时,这将成功,并且可以忘记此对象。如果应用程序崩溃或用户故意终止应用程序(比如说使用任务管理器),我希望同样的情况适用,当应用程序再次启动时,我们将发布这些不发送最后的刻度时间,到API。
现在我知道没有 100% 可靠的方法可以在应用程序终止时始终拥有正确的数据。蜱的最小损失是允许的。
我的想法
我正在考虑向 TicksCounter 类添加一些代码,该类使用二进制序列化将其所有内部内容保存到硬盘驱动器上的文件中。每次添加 10 的倍数时都会发生这种情况。
我的问题是这似乎是一项非常昂贵的操作,因为我正在保存到硬盘驱动器,而且我会经常这样做。最小的性能损失不是问题,因为我正在运行一个执行大量繁重工作的 Windows 服务,因此不会被注意到。但我正在寻找更好更正确的解决方案。
对于这种情况,什么是好方法?还是我应该坚持我的方法?