Хорошо, я недавно внедрил фоновый рабочий для выполнения сохранения и загрузки данных.
Однако заставить его работать с командой сохранения оказалось трудным.
По сути, моя команда сохранениягенерирует событие, которое уведомляет модель представления коллекции, что Item был добавлен и что элемент должен быть добавлен к его собственной ObservableCollection.
В этот момент я получаю обычное исключение, в котором говорится, что я НЕ могу обновить ICollection в другом потоке.Я попытался создать новый тип списка, который вызывает Dispatcher.Invoke
, однако это все еще вызывает то же исключение.
Мне было интересно, есть ли у кого-нибудь еще какие-либо предложения о том, как лучше всего справиться с этим?
Итак, в настоящее время у меня есть класс, который наследуется от ObservableCollection:
public class ThreadSafeObservableCollection<T> : ObservableCollection<T>
{
public ThreadSafeObservableCollection(List<T> collection)
: base(collection)
{
dispatcher = Dispatcher.CurrentDispatcher;
rwLock = new ReaderWriterLock();
}
protected override void InsertItem(int index, T item)
{
if (dispatcher.CheckAccess())
{
if (index > this.Count)
return;
LockCookie c = rwLock.UpgradeToWriterLock(-1);
base.InsertItem(index, item);
rwLock.DowngradeFromWriterLock(ref c);
}
else
{
object[] obj = new object[] { index, item };
dispatcher.Invoke(
DispatcherPriority.Send,
(SendOrPostCallback)delegate { InsertItemImpl(obj); },
obj);
}
}
Затем у меня есть класс модели представления с фоновым рабочим, который выполняет сохранение.
Как только сохранение завершено,событие передается другой модели представления для обновления ее списка.
protected override void OnObjectAddedToRepository(object sender, ObjectEventArgs<cdAdministrators> e)
{
Dispatcher x = Dispatcher.CurrentDispatcher;
var viewModel = new AdministratorViewModel(e.EventObject, DataAccess);
viewModel.RecentlyAdded = true;
viewModel.ItemSelected += this.OnItemSelected;
this.AllViewModels.Add(viewModel);
RecentlyAddedViewModel = viewModel;
OnPropertyChanged(null);
}
Оба списка создаются отдельным фоновым рабочим потоком.