周期性任务中出现无效的跨线程访问异常

本文关键字:线程 访问 异常 无效 任务 周期性 | 更新日期: 2023-09-27 18:20:05

我正试图使用定期任务代理在shell tile上显示我的顶部tweet。互动程序必须每30分钟更新一次。我使用任务并行库是为了它是连续的。问题是我得到了一个"INVALID CROSS THREAD ACCESS"异常。

这是我的日程任务代理代码:

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

周期性任务中出现无效的跨线程访问异常

由于工作是在后台线程上完成的,因此无法在同一线程上更新UI。相反,在更新UI的部分使用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);
    }
}