0

別のプロパティ コレクションを返すタイプ Observable コレクションのプロパティがあります。アクセスして別のクラスからプロパティを列挙すると、コレクションが変更されたという例外が発生します。プロパティをロックしようとしましたが、機能していないようです。助けて感謝

4

2 に答える 2

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 に答える
0

ObservableCollection が列挙され、UI スレッドから編集されていることを確認する必要があります。そのためには、次のように使用します。

Application.Current.Dispatcher.BeginInvoke(new Action(() =>
{
    MyCollection.Add(new Item());
}
于 2013-02-05T15:01:51.007 に答える