在使用Dispatcher之后,仍然得到异常“应用程序称为为不同线程编组的接口”

时间:2016-08-11 08:03:14

标签: c# multithreading async-await uwp winrt-async

[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;
    }

但我仍然遇到同样的异常错误。可能是什么问题?

1 个答案:

答案 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(() =>的调用会切换线程。