2016-08-11 136 views
0
public ObservableCollection<College> Colleges { get; set; } 

私のコレクションは大学データを保持しています。Dispatcherを使用した後に、「アプリケーションは別のスレッド用にマーシャリングされたインターフェイスと呼ばれる」例外をまだ受けています。

public static Task<College> getCollege(string uniqueid) 
    { 
     return Task.Run(() => 

      Colleges.Where(coll => coll.UniqueID.Equals(uniqueid)).First() 
     ); 
    } 

個々の大学を取得するための実装。

protected override async void OnNavigatedTo(NavigationEventArgs e) 
    { 
     var college = await DataSource.getCollege((string)e.Parameter); 
     coll_grid.DataContext = college; 
    } 

GUIは、これが私の最初の実装であり、それがうまく働いたが、その後、私はステファン・クリアリーによって、あなたが実装でTask.Runを使用してはならないことの趣旨をTask.Run Etiquetteをお読みください。

だから私は、私が得たこの

public static College getCollege(string uniqueid) 
    { 
     var match = CollegeData.Colleges.Where(coll => coll.UniqueID.Equals(uniqueid)); 
     return match.First(); 
    } 

GUI

protected override async void OnNavigatedTo(NavigationEventArgs e) 
    { 
     var college = await Task.Run(() => DataSource.getCollege((string)e.Parameter)); 
     coll_grid.DataContext = college; 
    } 

その後、私はCoreApplicationを追加した例外

「アプリケーションが別のスレッドにマーシャリングされたインターフェイスと呼ばれる」私のコードを変更.MainView.Dispatcher.RunAsyncこれを修正するためのGUIコード。

GUI

protected override async void OnNavigatedTo(NavigationEventArgs e) 
    { 
     await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => 
     { 
      var college = await Task.Run(() => DataSource.getCollege((string)e.Parameter); 
      coll_grid.DataContext = college; 
     }); 
    } 

しかし、私はまだ同じ例外エラーを取得しています。何が問題なのでしょうか?

答えて

2

まず、リスト/コレクション内の要素を見つけるときに単純なことを行うときは、Task.Runを使用する理由はまったくありません。ただ、

coll_grid.DataContext = Colleges.First(coll => coll.UniqueID.Equals(uniqueid)) 

を使用しかしDispatcherはあなたを助けにはならなかった理由は、あなたがそれにちょうどDataContext割り当てを行う必要があるということです。

var college = await Task.Run(() => DataSource.getCollege((string)e.Parameter); 
await CoreApplication.MainView.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async() => 
    { 
    coll_grid.DataContext = college; 
}); 

await Task.Run(() =>を呼び出すとスレッドが切り替わるためです。

+0

私はそれを試みましたが、このコード行でも同じエラーが発生しています。 var大学は、Task.Run(()=> DataSource.getCollege((文字列)e.Parameter); –

+0

を待つばかげたばかげたTask.Run –

関連する問題