仍然收到异常“应用程序调用了为不同线程编组的接口”;在使用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;
        });
    }

但是我仍然得到相同的异常错误。有什么问题吗?

仍然收到异常“应用程序调用了为不同线程编组的接口”;在使用Dispatcher之后

首先,在做简单的事情时,如在列表/集合中查找元素时,绝对没有理由使用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(() =>切换线程