2

关于代理的问题:我特别想创建一个定期任务,但只想每天运行一次,比如凌晨 1 点,而不是默认的每 30 分钟运行一次。在 OnInvoke 中,我是否只是检查小时,并且仅当当前时间与所需时间匹配时才运行它。
但在下一次 OnInvoke 调用中,它将尝试在 30 分钟内再次运行,可能是凌晨 1:31。

所以我想我会在应用程序设置中使用存储的布尔值来标记为“今天已经运行”或类似的,然后检查该值?

4

2 回答 2

1

如果您按日期(每天一次),并且任务可以在一天的晚上 11 点和第二天的凌晨 1 点运行是有效的,那么在代理运行后,您可以存储当前日期(忘记时间)。然后每当代理在 30 分钟内再次运行时,检查任务上次运行的日期是否与当前日期相同。

protected override void OnInvoke(ScheduledTask task)
{
    var lastRunDate = (DateTime)IsolatedStorageSettings.ApplicationSettings["LastRunDate"];

    if(DateTime.Today.Subtract(lastRunDate).Days > 0)
    {
        // it's a greater date than when the task last ran
        // DO STUFF!
        // save the date - we only care about the date part
        IsolatedStorageSettings.ApplicationSettings["LastRunDate"] = DateTime.Today;
        IsolatedStorageSettings.ApplicationSettings.Save();
    }
    NotifyComplete();
}
于 2013-10-12T22:33:47.277 回答
1

如果您特别想在凌晨 1 点运行自定义操作,我不确定单个布尔值是否足以使其工作。

我猜您计划在 1:31 重置您的布尔值以准备第二天的执行,但是如果您的周期性任务也在 1h51 被调用(所谓的在凌晨 1 点到 2 点之间调用超过 2 次)怎么办。这怎么可能发生?好吧,如果设备重新启动,也许会发生这种情况,但我不确定。在任何情况下,将上次执行日期时间存储在某处并将其与当前日期时间进行比较可能是一种更安全的方法,以确保您的操作每天仅调用一次。

一个问题仍然存在:在哪里存储您的布尔值或日期时间(取决于您选择哪一个)?根据 msdn,AppSetting 似乎不是推荐的地方:

在前台应用程序和后台代理程序之间传递信息可能具有挑战性,因为无法预测代理程序和应用程序是否会同时运行。以下是为此推荐的模式。

  1. 对于定期和资源密集型代理:使用 LINQ 2 SQL 或使用互斥锁保护的隔离存储中的文件。对于前台应用程序写入而代理仅读取的单向通信,我们建议使用带有 Mutex 的隔离存储文件。我们建议您不要使用 IsolatedStorageSettings 在进程之间进行通信,因为数据可能会损坏。

隔离存储中的一个简单文件应该可以完成工作。

于 2013-10-12T22:53:34.597 回答