2012-01-10 81 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

相關問題