2011-08-14 41 views
0

使用芒果,可以創建一個計劃任務來更新ShellTiles數據。如何使用WP7計劃任務處理異步網絡I/O?

完成任務後,您可以致電NotifyComplete()完成任務。

鑑於手機上的I/O應該是異步的,在調用NotifyComplete()之前,您如何確保您的I/O已完成?

通過同步primatives?或者一旦任務通知手機的操作系統完成,I/O是否會被允許完成?

同步優勢是顯而易見的答案,但在手機上,阻止並不是一個好的選擇。

回答

3

計劃任務不會同步執行。他們被啓動,然後在強制終止之前有15秒的時間致電NotifyComplete(或放棄)。

在直接回答您的問題時,您將使用異步IO方法,然後從完整事件或回調中調用NotifyComplete

下面是一個例子。我已經使用了Microsoft.Phone.Reactive的東西,但如果您願意的話,您可以使用傳統方式的Begin/EndGetResponse。

public class SampleTask : ScheduledTaskAgent 
{ 
    protected override void OnInvoke(ScheduledTask task) 
    { 
     HttpWebRequest request = WebRequest.CreateHttp("http://stackoverflow.com"); 

     Observable.FromAsyncPattern<WebResponse>(
       request.BeginEndResponse, 
       request.EndGetResponse 
      )() 
      .Subscribe(response => 
      { 
       // Process the response 
       NotifyComplete(); 

      }, ex => 
      { 
       // Process the error 
       Abort(); // Unschedules the task (if the exception indicates 
         // the task cannot run successfully again) 
      }); 

     // Synchronous control flow will continue and exit the OnInvoke method 
    } 
} 
+1

我不會總是在失敗時調用Abort(),它會取消調度任務,直到應用程序再次運行。你不想這樣做,只是因爲在一個更新上有一個不規則的網絡連接。 –

+0

@克里斯 - 同意,我只是想說明選項。我已經添加了一條評論來清除這個問題。 –