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

대학 데이터를 보유한 My collection.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를 참조하십시오.

그래서 난 내 코드 나는

가 그럼 난 CoreApplication을 추가 예외 "응용 프로그램이 다른 스레드 정렬 화 된 인터페이스를 소위"가지고

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

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

GUI 변경 .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 college = Task.Run (() => DataSource.getCollege ((string) e.Parameter); –

+0

그냥 바보 같은 Task.Run –