0

我有一个 Observable 集合类型的属性,它返回另一个属性集合。当我通过访问它来枚举另一个类的属性时,我得到集合被修改异常。我尝试锁定该属性,但它似乎不起作用。任何帮助表示赞赏

4

2 回答 2

0

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

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    MyCollection.Add(new Item());
}
于 2013-02-05T15:01:51.007 回答
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 线程上获取集合的副本(例如数组)然后后台线程对其进行处理。

于 2013-02-05T15:03:21.530 回答