65.9K
CodeProject 正在变化。 阅读更多。
Home

接着上次停止的地方

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.81/5 (27投票s)

2011年11月27日

CPOL

3分钟阅读

viewsIcon

49185

频繁保存当前工作状态,以便下次可以从上次停止的地方继续。

引言

许多类型的应用程序必须具备从异常终止后恢复并从停止的地方继续运行的能力。例如,硬盘恢复、备份应用程序、数据处理等,异常终止可能由计算机重启、崩溃或人为错误引起。这个技巧是一个概念性的通用技巧,其基本思想是:频繁地保存当前工作状态,这样无论发生什么,即使出现异常终止,也能让软件从停止的地方继续运行。这个技巧在大多数情况下都很有用。我多年来一直使用它,尤其是在处理包含 100,000+ 条记录的数据处理应用程序时,它为我节省了大量时间。诚然,人们总是可以想到一些特定的记录或任务会导致未处理的错误,并且我建议的机制会一遍又一遍地重现相同的错误,但这可以通过适当的错误处理机制来解决。

一个简单的恢复机制包含两个部分

  1. 不断保存当前状态。
  2. 从异常终止中恢复。

保存当前状态

为了保存当前状态,我们需要确定哪些信息足以能够继续进行中的过程。例如,如果我们遍历数据库并处理每条记录,那么保存数据库详细信息、表/记录集名称以及指向当前已处理记录的索引就足够了。无需保存已处理的数据。

保存当前状态的位置

保存此类信息的最佳位置是注册表。您可以为应用程序创建一组键,并在处理循环中保存必要的数据。将此类数据存储在注册表中比打开数据文件并将数据存储在文件中要快得多。

Dim LastProcessedRecord As Integer
LastProcessedRecord = CurrentProcessedRecord
My.Computer.Registry.SetValue "HKEY_CURRENT_USER\Software\MyApp", "LastProcessedRecord",

如何区分正常终止和异常终止

如果没有办法区分正常终止和异常终止,那么建立这种机制就没有意义。为了做到这一点,我们需要区分这两者,以及任务的正常终止或完成。为此,我们需要在任务完成后清除“上次处理的记录”键(或用于该目的的任何名称)。

自动恢复

其想法是自动检测应用程序上次运行时的异常终止,并在这种情况下弹出一个消息给用户,询问他或她是否要从上次停止处理的地方继续。当应用程序首次运行时,或者当它按预期完成任务时,不会出现此消息。

Dim LastProcessedRecord As Integer
LastProcessedRecord = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\
MyApp", "LastProcessedRecord", -1)

当请求自动恢复时,初始索引将被提升到上次的值,而不是从为其分配的第一个值开始。因此,如果任务涉及处理记录号 100 到 200,并且上次应用程序在到达记录 150 后崩溃,那么下次,索引将从 150 开始,而不是从 100 开始。

历史

  • 2011年11月27日:初始版本
© . All rights reserved.