1

我正在编写一个应用程序,我需要在其中跟踪完成了多少操作以及完成了何种操作。完成所有操作后,此数据将发布到 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 服务,因此不会被注意到。但我正在寻找更好更正确的解决方案。

对于这种情况,什么是好方法?还是我应该坚持我的方法?

4

2 回答 2

1

您描述的方法并不是一个糟糕的方法,实际上我想有很多系统可以做到这一点,但是,正如您指出的 IO 绑定任务可能是资源密集型的。

相反,您可能需要考虑查看像RedisCouchbase这样的持久缓存解决方案,它们可以为您提供持久性检索速度。

于 2014-03-25T13:34:07.270 回答
0

我认为没有任何好的方法可以在没有磁盘 IO 的情况下保存 TicksCounter 的状态。您可以将其保存到内存中,但如果程序崩溃,这显然会丢失。您将运行第二个进程,您可以将 TicksCounter 的状态发送到作为备份。但这在我看来很糟糕。

根据您的 TicksCounter 对象中的实际内容,您可以简单地将对象序列化/反序列化为 XML 并根据需要将其保存/读取到磁盘。

于 2014-03-25T13:20:09.550 回答