从非UI线程更新数据绑定对象时的线程安全性(WPF / Silverlight)

时间:2010-10-17 19:55:35

标签: .net wpf data-binding thread-safety

这可能被视为Thread safety, lists, binding and WPF的副本,但我发布它仍然是因为我对接受的回复并不完全满意,而且我可能能够更准确地表达我怀疑是同一个问题

任何与WPF / Silverlight中的UI相关的操作都必须在UI上执行,包括INotifyPropertyChanged和INotifyCollectionChanged,但是 - 当数据绑定到一个对象(单个对象或集合)时,框架只会读取绑定数据的值在事件处理程序中同步对象,还是可以随时返回并查询对象?

我想要做的是让工作线程更新数据绑定对象(通常),如果集合是脏的,则定期引发CollectionChanged事件以触发UI更新。如果我可以知道框架只会读取事件处理程序中集合中的值,那么引发事件以锁定集合的代码中的简单锁定就足够了,但如果没有,我将不得不执行深层副本集合。

所以1)框架是否可以在事件处理程序之外读取我的集合; 2)如果可以的话,是否有更好的方法来更新工作线程上的内容并将其发布到UI而不是执行深层复制?

1 个答案:

答案 0 :(得分:0)

你不能保证某些东西只会在事件处理程序中读取你的结构,因为如果任何其他窗口控件导致在层次结构上刷新,则可以刷新数据绑定,因此锁定结构不是我要做的。

正如帖子中所提到的,你发现这样做的方法是确保使用下面的调度程序以安全的方式将事件发布到GUI线程:

public void DoWork(object sender, DoWorkEventArgs e)
{
    // Update GUI
    Dispatcher.BeginInvoke(new Action(MyPostMethod), DispatcherPriority.Normal);
}

public void MyPostMethod()
{
    // Here you´d post whatever data to the gui
}

我通常使用ActionAction<T>构造来为每个to-gui发布创建新的委托。