[A-Z0-9]+
我收藏的大学数据。
public ObservableCollection<College> Colleges { get; set; }
检索个别学院的实施。
GUI
public static Task<College> getCollege(string uniqueid)
{
return Task.Run(() =>
Colleges.Where(coll => coll.UniqueID.Equals(uniqueid)).First()
);
}
这是我原来的实现,它工作正常,但后来我读了Stephen Cleary的Here how it looks like.,并且从它的要点出发,你不应该在实现中使用Task.Run。
所以我改变了我的代码
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
var college = await DataSource.getCollege((string)e.Parameter);
coll_grid.DataContext = college;
}
GUI
public static College getCollege(string uniqueid)
{
var match = CollegeData.Colleges.Where(coll => coll.UniqueID.Equals(uniqueid));
return match.First();
}
我得到了“应用程序称为为不同线程编组的接口”异常
然后我将CoreApplication.MainView.Dispatcher.RunAsync添加到GUI代码中以解决此问题。
GUI
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
var college = await Task.Run(() => DataSource.getCollege((string)e.Parameter));
coll_grid.DataContext = college;
}
但我仍然遇到同样的异常错误。可能是什么问题?
答案 0 :(得分: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(() =>
的调用会切换线程。