Shell Phone无法在Windows Phone 7.1中正确更新

时间:2012-01-09 20:22:00

标签: c# .net windows-phone-7

我正在尝试从我的Twitter帐户获取推文,并在我的shell磁贴上显示最多的推文。所以我创建了一个后台代理(周期性任务)来完成它。每隔30分钟,后台代理应该访问我的推特时间线并获得我最热门的推文并将其显示在磁贴中。问题是我的磁贴只有一次更新,即当我启动代理时,之后它没有得到更新。

这是我的后台代理代码:

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

我只能获得一次推文。

3 个答案:

答案 0 :(得分:2)

完成后,您必须调用NotifyComplete()。如果不是,则将中止任务的调度。你为什么要评论它?

答案 1 :(得分:2)

我之前从未尝试过,但这似乎是编写期刊后台代理的一个很好的例子。

我的猜测是你应该在最后调用NotifyComplete(),告诉操作系统你的任务已经准备就绪。

Periodical Agent on Windows Phone 7

答案 2 :(得分: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;
}