Dispatcher.RunAsync(该应用程序称为为不同线程编组的接口。)

时间:2016-03-24 05:01:52

标签: c# multithreading winforms

该应用程序调用了一个为不同线程编组的接口。 (来自HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))

enter image description here

在我的一个视图中,我实例化了一个选项视图。

不确定选项是否应该是完全独立的对象。

当用户修改选项时,我希望它更新主视图。

实例化的第一个视图。

    public VideosFoundView()
    {
        this.InitializeComponent();
        this.initAddVideoFolderGridView();
        this.addVideoFolderScrollViewer.ViewChanged += addVideoFolderScrollViewer_viewChanged;
        options = new vfvOptions();
        options.PropertyChanged += optionsChanged;
        AppShell.Current.SetOptions(options);
    }

正如您所知,我在父视图的构造函数中实例化了vfvOptions视图,但是optionsChanged方法很难访问我在父视图中定义的内容。

    private async void optionsChanged(object sender, PropertyChangedEventArgs e)
    {
        await this.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal, async () =>
        {           
            //parse the options object   
            await Task.Run(() => 
            {
                this._GridViewVideoModels.Clear();
                for (int i = 0; i < VideosFoundView.MyVideoModels.Count - 1; i++)
                {
                    bool displayTile = true;

                    if (options.IgnoreImagesNotFound)
                        if (VideosFoundView.MyVideoModels[i].FullImageLocationOnDisk == "ms-appx:///Assets/image-not-found.gif")
                            displayTile = false;

                    if (displayTile)
                    {
                        this._GridViewVideoModels.Add(VideosFoundView.MyVideoModels[i]);                        
                    }
                }                   
                this.AddVideoFolderGridView.ItemsSource = _GridViewVideoModels;                                
            });
        });
    }

以上代码在:

处遇到异常
   this._GridViewVideoModels.Clear();

这在ViewFoundView类中定义如下:

    public ObservableCollection<MyVideo> _GridViewVideoModels = new ObservableCollection<MyVideo>();

我可能没有彻底了解事件,当事件被触发时,是从vfvOptions类/对象中触发的方法optionsChanged?

1 个答案:

答案 0 :(得分:0)

问题是因为我在Task.Run()

中调用了该方法