2012-01-09 17 views
2

私のツイッターアカウントからツイートを取得し、自分のシェルタイルの一番上のツイートを表示しようとしています。だから私はそれを行うバックグラウンドエージェント(定期的なタスク)を作成しました。バックグラウンドエージェントは30分ごとに私のtwitterのタイムラインにアクセスし、一番上のツイートを取得してタイルに表示する必要があります。問題は、タイルの更新が1回だけであることです。つまり、エージェントを起動した後、更新されていないということです。私は一度だけ、トップつぶやきを取得することができていますWindows Phone 7.1でシェルティールが正しく更新されない

protected override void OnInvoke(ScheduledTask task) 
{ 
    ShellToast popupMessage = new ShellToast() 
    { 
     Title = "My First Agent", 
     Content = "Background Task Launched", 
    }; 

    WebClient twitter = new WebClient(); 
    twitter.DownloadStringCompleted += new DownloadStringCompletedEventHandler(twitter_DownloadStringCompleted); 
    twitter.DownloadStringAsync(new Uri("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=dnivra26")); 
    popupMessage.Show(); 
} 

private void twitter_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
{ 
    if (e.Error != null) 
     return; 

    XElement xmlTweets = XElement.Parse(e.Result); 

    var message2 = (from tweet in xmlTweets.Descendants("status") 
        select tweet.Element("text").Value).FirstOrDefault(); 

    UpdateAppTile(DateTime.Now.ToString() + message2.ToString()); 
} 

private void UpdateAppTile(string message) 
{ 
    ShellTile appTile = ShellTile.ActiveTiles.First(); 
    if (appTile != null) 
    { 
     StandardTileData tileData = new StandardTileData 
     { 
      BackContent = message 
     }; 

     appTile.Update(tileData); 
     //NotifyComplete(); 
    } 
} 

は、ここに私のバックグラウンドエージェント・コードです。

答えて

2

完了したら、NotifyComplete()を呼び出す必要があります。そうでない場合、タスクのスケジューリングは中止されます。なぜあなたはそれをコメントアウトしましたか?

+1

。 :D – BigL

2

これまでに試したことはありませんが、これは定期的なバックグラウンドエージェントを書く良い例のようです。

私の推測では、最後にNotifyComplete()を呼び出す必要があります。これは、あなたのタスクが準備完了であることをOSに伝えます。他の人が言ったように

Periodical Agent on Windows Phone 7

1

は、あなたが完了した時点でNotifyComplete()を呼び出す必要があります。ただし、非同期イベントWebClient.DownloadStringCompletedを使用するため、ダウンロード文字列が完了するまで実行をロックする必要があります。

このため、Task Parallel Library for Silverlightを使用することをおすすめします。あなたがする必要があるだろう何

、このようなものです:私は応答を遅くすることでした

protected override void OnInvoke(ScheduledTask task) 
{ 
    ShellToast popupMessage = new ShellToast() 
    { 
     Title = "My First Agent", 
     Content = "Background Task Launched", 
    }; 
    popupMessage.Show(); 

    UpdateTile().ContinueWith(x => NotifyComplete()); 
} 

private Task<bool> UpdateTile() 
{ 
    var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.AttachedToParent); 

    WebClient twitter = new WebClient(); 

    twitter.DownloadStringCompleted += (sender, e) => 
    { 
     if (e.Error != null) 
     { 
      tcs.TrySetResult(true); 
     } 
     else 
     { 
      XElement xmlTweets = XElement.Parse(e.Result); 

      var message2 = xmlTweets.Descendants("status") 
            .Select(x => x.Element("text").Value).FirstOrDefault(); 

      ShellTile appTile = ShellTile.ActiveTiles.First(); 

      if (appTile != null) 
      { 
       StandardTileData tileData = new StandardTileData 
       { 
        BackContent = DateTime.Now.ToString() + message2.ToString() 
       }; 

       appTile.Update(tileData); 

       tcs.TrySetResult(true); 
      } 
      else 
      { 
       tcs.TrySetResult(true); 
      } 
     } 
    }; 

    twitter.DownloadStringAsync(new Uri("http://api.twitter.com/1/statuses/user_timeline.xml?screen_name=dnivra26")); 

    return tcs.Task; 
} 
+0

"Visual Studio 2010 express for windows phone"にSystem.Threading.Tasksパッケージをインストールするにはどうすればいいですか?私はWindows Mobile開発には新しいです。これで私を助けてください。 – dnivra

+0

http://docs.nuget.org/docs/start-here/installing-nuget –

+0

私はパッケージをインストールし、あなたが言ったように変更を加えました。しかし、この行 "var tcs = new TaskCompletionSource (TaskCreationOptions.AttachedToParent);" "UnauthorizedAccessException"が表示されています。私は今何をすべきですか? – dnivra

関連する問題