仍然收到异常“应用程序调用了为不同线程编组的接口”;在使用Dispatcher之后
本文关键字:接口 之后 Dispatcher 线程 异常 应用程序 调用 | 更新日期: 2023-09-27 18:02:07
public ObservableCollection<College> Colleges { get; set; }
My collection of College data.
public static Task<College> getCollege(string uniqueid)
{
return Task.Run(() =>
Colleges.Where(coll => coll.UniqueID.Equals(uniqueid)).First()
);
}
检索单个学院的实现。
GUI protected override async void OnNavigatedTo(NavigationEventArgs e)
{
var college = await DataSource.getCollege((string)e.Parameter);
coll_grid.DataContext = college;
}
这是我最初的实现,它工作得很好,但后来我读了任务。运行Stephen Cleary的礼仪,从要点来看,你不应该使用Task。在实现中运行
所以我把代码改成了
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;
});
}
但是我仍然得到相同的异常错误。有什么问题吗?
首先,在做简单的事情时,如在列表/集合中查找元素时,绝对没有理由使用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(() =>
切换线程