【发布时间】:2010-09-02 15:10:43
【问题描述】:
好的,我最近实现了一个后台工作程序来执行数据的保存和加载。
但是,事实证明,要让它在保存命令上工作很困难。
基本上,我的保存命令会生成一个事件,通知集合视图模型,一个项目已被添加并且该项目应该被添加到它自己的 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);
}
这两个列表都是由单独的后台工作线程创建的。
【问题讨论】:
标签: c# wpf multithreading observablecollection