2016-04-24 4 views
0

私は小さなユニバーサルウィンドウアプリケーションを作成しています。私はMapControlを使ってインターネットからダウンロードしたデータを提示したいと思います。このデータは毎分更新され、発生するたびにMapIconのポジションを更新したいと考えています。 地図をロードした後、60秒ごとに実行され、HttpWebRequestを使用してデータをダウンロードし、受信したJSONを解析し、MapControlに表示されたMapIconの位置を更新するタイマーを作成します。私はタイマーコールバックで新しいMapIcon()を呼び出すときTimerコールバックでのMapIconの作成

すべてが、私は例外を持っているが、正常に動作する必要があります:種類の例外「のSystem.Exception」のnewproject.exeで発生したが、中に処理されなかった

ユーザーコード

追加情報:このアプリケーションは、別のスレッド用にマーシャリングされたインターフェイスを呼び出しました。 (HRESULTからの例外:0x8001010E(RPC_E_WRONG_THREAD))

マイタイマーコールバックのコードがあるが:

private async void OnTimerTick(Object stateInfo) 
    { 
     var TramDataList = await Loader.LoadData(); 
     updateMarkers(TramDataList); 
    } 

    private void updateMarkers(List<TramData> tramList) 
    { 
     lock (TramMarkerDict) 
     { 
      foreach (var tramData in tramList) 
      { 
       if (!TramDataDict.ContainsKey(tramData.Id)) 
       { 
        TramDataDict.Remove(tramData.Id); 
        TramMarkerDict.Remove(tramData.Id); 
       } 
      } 

      foreach (var tramData in tramList) 
      { 
       TramData tmp = null; 
       var exists = TramDataDict.TryGetValue(tramData.Id, out tmp); 
       if (exists) 
        tmp.update(tramData); 
       else 
        TramDataDict.Add(tramData.Id, tramData); 
      } 

      foreach (var tramData in TramDataDict.Values) 
      { 
       MapIcon mapIcon = null; 
       var geopoint = new Windows.Devices.Geolocation.Geopoint(
        new Windows.Devices.Geolocation.BasicGeoposition { Latitude = tramData.Lat, Longitude = tramData.Lng }); 
       var exists = TramMarkerDict.TryGetValue(tramData.Id, out mapIcon); 
       if (exists) 
        mapIcon.Location = geopoint; 
       else 
       { 
        mapIcon = new MapIcon { Location = geopoint, Title = tramData.FirstLine, NormalizedAnchorPoint = new Point(0.5, 1) }; 
        TramMarkerDict.Add(tramData.Id, mapIcon); 
       } 
      } 
     } 
    } 

答えて

1

ディスパッチャを使用してみてください。 UIスレッドにMapIconオブジェクトを追加する必要があります。

private async void MainPage_Loaded(object sender, RoutedEventArgs e) 
    { 
     await this.Dispatcher.RunAsync(CoreDispatcherPriority.Normal,() => 
     { 
      // Your Code 
     }); 
    } 
0

Jean-Sébastien Dupuy's answerは技術的に正しいですが、別のオプションは、HttpClient代わりのHttpWebRequestを使用して、自動的に正しいスレッド上で動作するすべてのものを確実にするためにawaitキーワードを使用することです。 (DispatcherTimerを使用していて、他の種類のタイマーは使用していないことを確認してください)。

関連する問題