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(); 
    } 
} 

問題是,爲什麼會發生這種情況以及我如何解決問題。 提前謝謝!

+0

跨線程的問題不談,爲什麼你想使用'DispatcherTimer '提早NotifyComplete()'?這並不能確保你的'ScheduledTaskAgent'將來會被調用 - 代理中沒有例外,用戶也不會繼續使用這個應用程序。 –

+0

不需要定時器(DispatcherTimer或普通定時器)。後臺代理的時間限制是代碼執行時間(即:代碼使用的機器週期數量)。此時不包括等待服務響應的時間。 –

+0

@ShawnKendrot這是一個非常有趣的信息。你有什麼資源可以支持它嗎? –

回答

0

當您嘗試從非創建控件的線程變更UI屬性時引發跨線程訪問錯誤。

通過它您使用中存在的控制

Invoke方法的代碼應該是這個樣子:

Control.Invoke((MethodInvoker)delegate{ 
//Do your work here for example NotifyComplete(); 
}); 
相關問題