CollectionView不支持从与调度程序线程不同的线程更改其源集合-由调度程序线程引起

时间:2018-11-23 22:06:07

标签: c# multithreading observablecollection collectionview

我有一个ObservableCollection和一个使用OC作为源的ICollectionView:

private ObservableCollection<Comment> _Comments = new ObservableCollection<Comment>();
/// <summary>
/// Comments on the account
/// </summary>
[BsonElement("comments")]
public ObservableCollection<Comment> Comments
{
    get
    {
        return _Comments;
    }
    set
    {
        _Comments = value;
        OnPropertyChanged("Comments");
        OnPropertyChanged("CommentsSorted");
    }
}
private ICollectionView _CommentsSorted;
/// <summary>
/// Sorted list (reverse order) of the comments
/// </summary>
[BsonIgnore]
public ICollectionView CommentsSorted
{
    get
    {
        return _CommentsSorted;
    }
    set
    {
        _CommentsSorted = value;
        OnPropertyChanged("CommentsSorted");
    }
}

我有一个运行的命令:

obj.Comments.Add(new Comment(Message));

其中obj是包含可观察集合的类的实例。

呼叫此行时,出现以下异常:

System.NotSupportedException:'此CollectionView类型不支持从与Dispatcher线程不同的线程对其SourceCollection进行更改。'

我打开了“调试”>“ Windows”>“线程”面板,它在主线程上运行。我尝试将其放入App.Current.Dispatcher.Invoke(...),不走运。

我不知道为什么会这样。使事情变得陌生的是,我能够在同一时间创建的同一类的另一个实例上运行良好(完全没有问题)(在同一调用中从我的数据库返回并一起创建)。我第一个添加评论没有问题,每次都可以,但是我尝试过的所有其他评论都失败了。

1 个答案:

答案 0 :(得分:1)

在我的情况下,问题是在任务中刷新了集合视图。然后稍后从Main UI线程添加到集合中导致异常。

在构建视图模型时,会在延迟的任务中刷新集合。

public MainVM()
{
    //other code...
    Task.Delay(100).ContinueWith(_ => UpdatePreferences());
}


public void UpdatePreferences()
{
    //other code..
    CollectionViewSource.GetDefaultView(Data.Customers).Refresh();
}

我能够通过调用调度程序来解决问题。

Task.Delay(100).ContinueWith(_ => App.Current.Dispatcher.Invoke(()=> UpdatePreferences()));