2012-01-10 12 views
1

定期タスクエージェントを使用してシェルタイルに自分のトップツイートを表示しようとしています。タイルは30分ごとに更新される必要があります。タスク並列ライブラリを使用して連続的に使用していますか?問題は、「無効なクロススレッドアクセス」例外が発生していることです。ここで定期タスクの無効なクロススレッドアクセス例外

は私のスケジュールTask Agentのコードです:

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

//これは私がDID CHANGE AND

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

}); 
IS

例外として表示される行は次のとおりです。

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

Windows Mobile 7が存在しないことを確認してください:Windows Phone 7は全く異なるOSであり、Compact Frameworkを使用しません。あなたのタイトルを変更し、より正確なタグを使用してください! ;) –

答えて

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 =のDateTime .Now.ToString()+ message2.ToString() }; appTile.Update(tileData); tcs.TrySetResult(TRUE);他 } { tcs.TrySetResult(TRUE);} });どこが間違っていますか? – dnivra

+1

コメントのコードを読むのはやや難しいですが、元の投稿を更新してください。また、どの行がエラーをスローしますか? – keyboardP

+0

は質問を編集し、最後の部分にコードを掲載しました。それを通って、どこが間違っているのか教えてください。ありがとう – dnivra

関連する問題