Связывание: свойства, изменяющие рабочий поток - PullRequest
1 голос
/ 27 ноября 2011

У меня есть следующий код:

class Customers : BindableObject
{

    private ObservableCollection<string> _Products = new ObservableCollection<string>();

    public ObservableCollection<string> Products
    {
        get
        {
            return _Products;
        }
        set
        {
            _Products = value;
            RaisePropertyChanged("Products");
        }
    }

    private string _Name = "John";

    public string Name
    {
        get
        {
            return _Name;
        }
        set
        {
            _Name = value;
            RaisePropertyChanged("Name");
        }
    }


    public Customers()
    {
        Products.Add("George");
        Products.Add("Henry");
    }

    public void LongRunningFunction()
    {
        Name = "Boo";

        Thread.Sleep(5000);

        Name = "Peter";

    }

    public void ThreadedLongRunningFunction()
    {
        Task t = new Task(new Action(LongRunningFunction));
        t.Start();

    }


    public void LongRunningFunctionList()
    {
        Products.Add("Boo");

        Thread.Sleep(5000);

        Products.Add("Booya");

    }

    public void ThreadedLongRunningFunctionList()
    {
        Task t = new Task(new Action(LongRunningFunctionList));
        t.Start();

    }

}

BindableObject реализует INotifyPropertyChanged.

У меня в MainWindow.xaml.cs

public partial class MainWindow : Window
{

    Model.Customers c = new Model.Customers();

    public MainWindow()
    {
        InitializeComponent();

        gridToBindTo.DataContext = c;
    }

    private void cmdRun_Click(object sender, RoutedEventArgs e)
    {
        c.LongRunningFunction();
    }

    private void cmdRunAsync_Click(object sender, RoutedEventArgs e)
    {
        c.ThreadedLongRunningFunction();
    }

    private void cmdRunListSync_Click(object sender, RoutedEventArgs e)
    {
        c.LongRunningFunctionList();
    }

    private void cmdRunListAsync_Click(object sender, RoutedEventArgs e)
    {
        c.ThreadedLongRunningFunctionList();
    }

}

Мое главное окно имеет метку, привязанную к имени, и список, связанный с продуктами.

В многопоточной версии обеих функций я не понимаю, почему мне разрешено работать со свойством «Имя» (строка), которое связано с пользовательским интерфейсом в другом потоке, но я не могу сделать то же самое для ObservableCollection.

Может кто-нибудь объяснить, почему здесь есть разница?

Привет

1 Ответ

1 голос
/ 27 ноября 2011

ObservableCollection не является thread safe, поэтому его нельзя изменить в разных диспетчерах.Но вы всегда можете переопределить ObservableCollection, чтобы сделать его потокобезопасным.Взгляните на образец здесь - http://tomlev2.wordpress.com/2009/04/17/wpf-binding-to-an-asynchronous-collection/

Суть в том, чтобы поднять collectionChanged и propertyChanged в дипатчере интерфейса пользователя, где была создана коллекция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...