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

时间:2013-02-05 14:39:55

标签: c# multithreading observablecollection

我有一个类型Observable集合的属性,它返回另一个属性集合。当我通过访问它从另一个类枚举属性时,我得到集合被修改的异常。我试图锁定属性但它似乎没有work.Any help赞赏

2 个答案:

答案 0 :(得分:0)

您应该确保枚举ObservableCollection从UI线程结束编辑。为此,请使用它:

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

答案 1 :(得分:0)

锁定某个对象不会执行任何事情,除非其他人同时锁定同一个对象。如果你绝对必须从后台线程访问这个集合,那么你应该确保枚举集合的线程和修改集合的线程都锁定在相同的对象上。

它也被认为是锁定专用锁定对象而不是公共可访问对象的良好做法,例如

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线程。