0
我正在構建一個RSS閱讀器,我想添加一個定期任務來檢查新的提要項目。如果它發現任何新項目,它將相應地更新應用程序的Live Tile。後臺代理中引發的無效跨線程訪問
我遇到的問題是我正在使用DownloadStringAsync()方法下載提要並檢查它們是否包含新項目。因此,有時下載過程可能需要20秒以上的時間(完成周期性任務以完成其操作的時間)。
我想要的是確保在代理程序被操作系統終止20秒之後調用NotifyComplete()方法。由於這個原因,我想註冊一個15秒的調度器定時器,它會在其tick事件中調用NotifyComplete()方法。
但是,我試圖聲明並使用調度程序計時器,並且引發了無效的跨線程訪問錯誤。我的定期任務代碼包括以下內容:
public class ScheduledAgent : ScheduledTaskAgent
{
//Register a DispatcherTimer
DispatcherTimer masterTimer = new DispatcherTimer();
private static volatile bool _classInitialized;
public ScheduledAgent()
{
if (!_classInitialized)
{
_classInitialized = true;
// Subscribe to the managed exception handler
Deployment.Current.Dispatcher.BeginInvoke(delegate
{
Application.Current.UnhandledException += ScheduledAgent_UnhandledException;
});
}
//Set Timer properties
masterTimer.Interval = TimeSpan.FromSeconds(15);
masterTimer.Tick += masterTimer_Tick;
}
protected override void OnInvoke(ScheduledTask task)
{
//TODO: Add code to perform your task in background
masterTimer.Start();
//Call DownloadStringAsync() and perform other tasks...
//Call NotifyComplete() after the download is complete.
//
}
private void masterTimer_Tick(object sender, EventArgs e)
{
masterTimer.Stop();
//There is no more time left, we must call NotifyComplete() so as to avoid
//having the periodic task terminated by the OS
NotifyComplete();
}
}
問題是,爲什麼會發生這種情況以及我如何解決問題。 提前謝謝!
跨線程的問題不談,爲什麼你想使用'DispatcherTimer '提早NotifyComplete()'?這並不能確保你的'ScheduledTaskAgent'將來會被調用 - 代理中沒有例外,用戶也不會繼續使用這個應用程序。 –
不需要定時器(DispatcherTimer或普通定時器)。後臺代理的時間限制是代碼執行時間(即:代碼使用的機器週期數量)。此時不包括等待服務響應的時間。 –
@ShawnKendrot這是一個非常有趣的信息。你有什麼資源可以支持它嗎? –