2012-01-10 47 views
1

我正在尝试使用周期性任务代理程序在外​​壳磁贴上显示我的最新推文。瓷砖必须每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); 
+3

请检查Windows Mobile 7是否不存在:它是Windows Phone 7,它是一个完全不同的操作系统,它不使用Compact Framework。更改您的标题并使用更准确的标签! ;) – 2012-01-10 15:10:42

回答

4

由于工作是在后台线程上完成的,因此无法在同一线程上更新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); 
    } 
} 
+0

正如你所说,我没有使用Dispatcher,但仍然得到这个例外。这是代码更新。 Deployment.Current.Dispatcher.BeginInvoke(()=> { ShellTile appTile = ShellTile.ActiveTiles.First();! 如果(appTile = NULL){ StandardTileData tileData =新StandardTileData { BackContent =日期时间.Now.ToString()+ message2.ToString() }; appTile.Update(tileData); tcs.TrySetResult(TRUE);} 其他 { tcs.TrySetResult(TRUE);} });我哪里错了? – dnivra 2012-01-10 16:10:53

+1

阅读评论中的代码有点棘手,你能不能更新你的原始文章。另外,哪一行会引发错误? – keyboardP 2012-01-10 16:13:31

+0

编辑了问题并在最后一部分发布了代码。请通过它,让我知道我要去哪里错了。谢谢 – dnivra 2012-01-10 18:33:07

相关问题