代码之家  ›  专栏  ›  技术社区  ›  SoftMemes

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

  •  0
  • SoftMemes  · 技术社区  · 14 年前

    这可能被视为 Thread safety, lists, binding and WPF 但是我还是把它贴出来了,因为我对被接受的回答不完全满意,而且我可以更准确地表达我所怀疑的同一个问题。

    在wpf/silverlight中,任何与ui相关的操作都必须在ui上执行,包括inotifyPropertyChanged和inotifyCollectionChanged,但是-当数据绑定到对象(单个对象或集合)时,框架将只在事件处理程序中同步读取数据绑定对象的值,或者它是否可以随时返回并查询对象?

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

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

    1 回复  |  直到 14 年前
        1
  •  0
  •   Almund    14 年前

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

    正如在文章中提到的,您发现了这样做的方法,即使用下面的调度程序确保以安全的方式将事件发布到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
    }
    

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