代理问题:我特别想创建一个Periodic Task,但只想每天运行一次,比如说凌晨1点,而不是每30分钟运行一次。在OnInvoke中,我只是检查小时,并仅在当前小时与所需小时匹配时运行它 但是在接下来的OnInvoke电话会议上,它将尝试在30分钟内再次运行,也许是在凌晨1点31分。
所以我想我会在应用设置中使用存储的布尔值来标记为"已经为今天运行"或类似的,然后检查该值?
答案 0 :(得分: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();
}
答案 1 :(得分:1)
如果您特别想在凌晨1点运行自定义操作,我不确定单个布尔值是否足以使其正常工作。
我猜你打算在1:31重置你的布尔值以准备第二天的执行,但是如果你的周期性任务也在1h51被调用(在凌晨1点到凌晨2点之间被称为超过2次)会怎么样。 怎么会发生这种情况?好吧,如果设备重启,可能会发生这种情况,但我并不确定。在任何情况下,将最后一次执行日期时间存储在某处并将其与当前执行日期时间进行比较可以更安全地确保您的操作每天只调用一次。
还有一个问题:在哪里存储您的布尔值或日期时间(取决于您选择哪一个)? AppSetting似乎不是推荐地点according msdn:
在前台应用和后台代理之间传递信息 可能具有挑战性,因为不可能预测代理人 并且应用程序将同时运行。建议采用以下方法 这种模式。
- 对于定期和资源密集型代理:使用LINQ 2 SQL或使用Mutex保护的隔离存储中的文件。对于 前台应用程序写入的单向通信和 代理只读,我们建议使用带有的隔离存储文件 互斥。我们建议您不要使用IsolatedStorageSettings 在进程之间进行通信,因为数据可能存在 变得腐败。
醇>
隔离存储中的简单文件应该可以完成工作。