Shelltile не обновляется должным образом в Windows Phone 7.1 - PullRequest
2 голосов
/ 10 января 2012

Я пытаюсь получить твиты из своей учетной записи в твиттере и отобразить самый верхний твит на моей плитке оболочки. Поэтому я создал фоновый агент (периодическая задача), чтобы сделать это. Каждые 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 ]

2 голосов
/ 10 января 2012

Я никогда не пробовал это раньше, но это выглядит как хороший пример написания периодического фонового агента.

Я предполагаю, что вам следует вызвать NotifyComplete () в конце, который сообщает ОС, что ваша задачаготов.

Периодический агент на Windows Phone 7

2 голосов
/ 10 января 2012

Вы должны вызвать NotifyComplete (), когда закончите.Если нет, планирование задачи будет отменено.Почему вы это прокомментировали?

1 голос
/ 10 января 2012

Как уже говорили другие, вам нужно позвонить NotifyComplete() по завершении.Однако, поскольку вы используете асинхронное событие WebClient.DownloadStringCompleted, вам нужно заблокировать выполнение до завершения строки загрузки.

Для этого я рекомендую использовать библиотеку параллельных задач для 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...