Windows Phone 8 C# 背景服務 ScheduledTaskAgent 執行網路動作 使用 WebClient 範例教學

Windows Phone 8 背景服務 ScheduledTaskAgent 執行網路動作 使用 WebClient 範例教學
寫這篇文章的原因,是因為在許多初學者在撰寫APP時,會使用到背景服務獲取網路上的資訊 檔案、影片、Json、XML 都好,在撰寫的過程中會遇到一些弔詭的事情,譬如程式碼完全沒有錯,也沒有跳出錯誤訊息,可是怎麼資料就傳不回來了呢?接下為各位說明ScheduledTaskAgent 的工作模式。


請參考上一篇: Windows Phone 8 C# 背景服務 ScheduledAgent 教學 範例

 

首先寫這篇文章的原因,是因為在許多初學者在撰寫APP時,會使用到背景服務獲取網路上的資訊 檔案、影片、Json、XML 都好,在撰寫的過程中會遇到一些弔詭的事情,譬如程式碼完全沒有錯,也沒有跳出錯誤訊息,可是怎麼資料就傳不回來了呢?!

接下為各位說明ScheduledTaskAgent 的工作模式。

 

當我們開起ScheduledAgent.cs時會有以下的程式碼:


protected override void OnInvoke(ScheduledTask task)
{
       //這邊是你想要做的事情,背景服務會一直重複幫你做

       ScheduledActionService.LaunchForTest(tTask.Name, TimeSpan.FromSeconds(60));
       NotifyComplete();
}

 

注意到最後的NotifyComplete(); 是建立專案時自動幫我們所產生的Code,其實這篇文章的重點就是在講NotifyComplete()。

ScheduledTask 背景服務是每隔一段時間自動執行一次,而當觸發OnInvoke()時,相對應的也比需要有NotifyComplete()來做結尾,告訴系統這一次的工作已經結束了,可以繼續準備下一輪個計時並觸發下一次的事件,所以當OnInvoke()執行後沒有執行NotifyComplete(),這時候背影服務就會整個停擺,不會進行任何動作。

NotifyComplete() 字面上意思就是"通知完成",所以說當NotifyComplete() 之後發生的事件就不會被執行,這一點非常重要。

接下來就是網路動作的部分,因為網路動作必須要等待網路的回應,除非是做發送資料,不然的話都要等待網路回傳資料回來,所以在背景服務內撰寫網路動作時就要非常的謹慎。

先來一串錯誤的範例:


protected override void OnInvoke(ScheduledTask task){
    WebClient wc = new WebClient();
     wc.Encoding = Encoding.UTF8;
     wc.DownloadStringAsync(new Uri("http://www.dotblogs.com.tw/holiestar/archive/2013/10/27/125717.aspx"));
     wc.DownloadStringCompleted+=(sender,e)=>{
        Debug.WriteLine(e.Result);
    };
     NotifyComplete();
}

先來講解一下為什麼錯誤,因為DownloadStringCompleted必須要等待網路回應才會真正的執行Debug.WriteLine(e.Result) ,但是在等待網路回應前已經先NotifyComplete();並通知系統這一輪的背景任務結束了,所以在這個時間點所執行的動作都不會執行也就是DownloadStringCompleted並不會觸發。初學者往往會碰到這個問題,明明Code是正確的但卻不會正確的執行。

 

 

以下是正確的範例


protected override void OnInvoke(ScheduledTask task){
    WebClient wc = new WebClient();
     wc.Encoding = Encoding.UTF8;
     wc.DownloadStringAsync(new Uri("http://www.dotblogs.com.tw/holiestar/archive/2013/10/27/125717.aspx"));
     wc.DownloadStringCompleted+=(sender,e)=>{
        Debug.WriteLine(e.Result);
        NotifyComplete();
    };
     
}

講解正確的原因,因為當網路已經回應並觸發DownloadStringCompleted時已經執行Debug.WriteLine(e.Result);最後在執行NotifyComplete(), 意思是說當網路已經回應且所有我們要執行事情已經完成後再執行NotifyComplete();通知系統已結束這一輪的背景任務了,就可以開始等待下一次背景任務的觸發,如此一來便可以在背景服務中正常的使用網路動作。

 

文章中的敘述如有觀念不正確錯誤的部分,歡迎告知指正 謝謝

轉載請註明出處

SUKI

HOLIESTAR