2013-10-12 109 views
2

代理問題:我特別想創建一個定期任務,但只想每天運行一次,比如說上午1點,而不是每30分鐘一次,這是默認設置。在OnInvoke中,我是否只需檢查小時,然後只在當前小時符合所需小時的情況下運行它。
但是在下一次的OnInvoke調用中,它會嘗試在30分鐘內再次運行,也可能是凌晨1點31分。Windows Phone後臺代理

所以我想我會在應用程序設置中使用存儲的布爾值來標記爲「已爲今天運行」或類似,然後檢查該值?

回答

1

如果您特別想在凌晨1點運行自定義操作,我不確定一個布爾值是否足以使其工作。

我想你打算在1:31重置你的布爾值來準備第二天的執行,但是如果你的週期性任務也是在1h51(所謂的在凌晨1點和凌晨2點之間被稱爲2次以上)那麼怎麼辦? 這怎麼可能發生?那麼也許這可能會發生,如果設備重啓,但我不確定安靜。在任何情況下,將最後一次執行日期時間存儲在某個地方並將其與當前日期時間進行比較可能是確保您的操作每天僅調用一次的更安全的方法。

還有一個問題:在哪裏存儲您的布爾值或日期時間(取決於您選擇哪一個)? AppSetting似乎並沒有成爲一個建議報告地方according msdn

前臺應用程序和後臺代理 之間傳遞的信息是具有挑戰性的,因爲它是無法預測如果代理 和應用程序將同時運行。爲此,建議使用以下 模式。

  1. 對於定期和資源密集型代理程序:使用LINQ 2 SQL或使用互斥鎖保護的隔離存儲中的文件。對於 前臺應用程序寫入和代理只能讀取的單向通信,我們建議使用帶有 互斥體的隔離存儲文件。我們建議您不要使用IsolatedStorageSettings來 進程之間的通信,因爲數據可能會損壞 。

孤立存儲中的簡單文件應該完成工作。

+0

在「Linq 2 Sql」部分,我想知道它是否適用於使用Sqlite時,以及來自其他庫的linq支持? – Steve

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(); 
} 
相關問題