首页  >  文章  >  后端开发  >  如何解决'这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection”?

如何解决'这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection”?

Linda Hamilton
Linda Hamilton原创
2024-10-31 09:39:01517浏览

How to Resolve

错误:“这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection”

问题:

在 UI 线程以外的线程上修改 ObservableCollection 时出现错误。

解决方案:

1.使用 Dispatcher.Invoke:

要从不同线程更新 ObservableCollection,请使用 Dispatcher.Invoke 调用 UI 线程上的更改。

public void Load()
{
    matchList = new List<GetMatchDetailsDC>();
    matchList = proxy.GetMatch().ToList();

    foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
    {
        App.Current.Dispatcher.Invoke((Action)delegate
        {
            _matchObsCollection.Add(match);
        });
    }
}

2.使用 async/await:

或者,您可以使用 async/await 在 UI 线程上异步执行 Load 方法。

public void LoadAsync()
{
    Task.Run(async () =>
    {
        matchList = new List<GetMatchDetailsDC>();
        matchList = await proxy.GetMatchAsync();

        await Dispatcher.InvokeAsync(() =>
        {
            foreach (EfesBet.DataContract.GetMatchDetailsDC match in matchList)
            {
                _matchObsCollection.Add(match);
            }
        });
    });
}

DataGrid 绑定和刷新:

绑定:

<DataGrid ItemsSource="{Binding MatchObsCollection}"/>

异步刷新:

要异步刷新 DataGrid,请调用 Refresh委托中调度程序的方法。

public void RefreshDataGridAsync()
{
    Task.Run(() =>
    {
        Dispatcher.InvokeAsync(() =>
        {
            dataGridParent.ItemsSource = null;
            dataGridParent.ItemsSource = MatchObsCollection;
        });
    });
}

以上是如何解决'这种类型的 CollectionView 不支持从与 Dispatcher 线程不同的线程更改其 SourceCollection”?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn