正在从另一个线程枚举Observable Collection,同时更新c#

本文关键字:更新 Collection Observable 另一个 线程 枚举 | 更新日期: 2023-09-27 17:57:51

我有一个Observable集合类型的Property,它返回另一个属性集合。当我通过访问另一个类来枚举该属性时,我得到的集合被修改为异常。我试着锁上这处房产,但似乎不起作用。感谢的任何帮助

正在从另一个线程枚举Observable Collection,同时更新c#

锁定对象不会有任何作用,除非其他人也锁定了同一对象。如果您绝对必须从后台线程访问此集合,那么您应该确保枚举集合的线程和修改集合的线程都对同一对象具有锁。

它还认为锁定专用锁定对象而不是公共可访问对象(例如)是一种良好的做法

public class MyClass
{
    private object _mylock = new object();
    private ObservableCollection<string> _myCollection = new ObservableCollection<string>();
    public void DoEnumerate()
    {
        lock (_mylock)
        {
            foreach (var item in _myCollection)
            {
                // Do something
            }
        }
    }
    public void Modify()
    {
        lock (_mylock)
        {
            // Modify the collection here
        }
    }
}

如果您正在编写GUI应用程序,那么通常最好只在UI线程上修改集合-如果您需要对集合进行一些后台处理,则可以考虑在UI线程中复制集合(例如数组),然后由后台线程进行处理。

您应该确保ObservableCollection是从UI线程中枚举和编辑的。为了做到这一点,像这样使用它:

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    MyCollection.Add(new Item());
}