Недопустимое исключение межпотокового доступа в периодической задаче - PullRequest
1 голос
/ 10 января 2012

Я пытаюсь отобразить мой лучший твит на плитке оболочки с помощью агента периодических задач. Плитка должна обновляться каждые 30 минут. Я использую задачу параллельной библиотеки, чтобы она была непрерывной. Проблема в том, что я получаю исключение «НЕПРАВИЛЬНЫЙ КРЕСТОВЫЙ ДОСТУП».

Вот мой код агента задач по расписанию:

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

Это строка, которая выдает исключение:

var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.AttachedToParent);

// Это изменение, которое я сделал и

Deployment.Current.Dispatcher.BeginInvoke(() =>
{

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

});

Это линия, показывающая исключение:

var tcs = new TaskCompletionSource<bool>(TaskCreationOptions.AttachedToParent);

1 Ответ

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

Поскольку работа выполняется в фоновом потоке, вы не можете обновить пользовательский интерфейс в том же потоке.Вместо этого используйте Deployment.Current.Dispatcher.BeginInvoke() в разделах, где обновляется пользовательский интерфейс.

Deployment.Current.Dispatcher.BeginInvoke(() =>
{
    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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...