BindingSource, BindingList, DataGridView и межпоточный доступ - PullRequest
1 голос
/ 08 декабря 2011

У меня есть DataGridView с его источником, установленным на BindingSource, чей источник установлен на BindingList, который содержит объекты, которые реализуют INotifyPropertyChanged.Проблема в том, что логика обновления элементов в моем BindingList работает в отдельном потоке.Все абсолютно хорошо, но я не уверен, почему это работает вообще.Есть ли какая-либо логика в любом из них для обработки многопоточного доступа?Каков правильный подход в этом случае?

BindingSource _actionsBindingSource; // it's DGV's source
BindingList<IAction> _actionsList = ...;
...
interface IAction : INotifyPropertyChanged
{
   ...
}
...
actionsBindingSource.DataSource = _actionsList;
...
public void FireActions()
{
  new Thread(() =>
  {
    foreach (IAction action in _actionsList)
    {
      action.Execute(); // fires some PropertyChangedEventArgs events from non-UI thread
    }
  }).Start();    
}

Итак, мне любопытен мой FireActions() метод.

1 Ответ

0 голосов
/ 16 декабря 2011

Я бы посоветовал вам запускать свой код в потоке пользовательского интерфейса вместо использования другого потока. Проблема в том, что когда данные изменяют источник привязки, они в конечном итоге изменяют слепой элемент управления. Следовательно, вам необходимо загрузить данные, используя поток пользовательского интерфейса, а не рабочий поток.

Примером могут быть ссылки BindingSource на DataTable, а DataGrid - на BindingSource. Вы можете подумать, почему бы не использовать рабочий поток для загрузки данных в DataTable, чтобы избежать блокировки потока пользовательского интерфейса. Однако это не сработает, потому что BindingSource в конечном итоге необходимо обновить DataGrid, который является операцией пользовательского интерфейса.

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