WPF:CurrentDispatcher.CheckAccess和CanExecuteChanged的问题

时间:2010-10-09 00:44:32

标签: wpf multithreading dispatcher

有时当我从后台线程调用RaiseEvent CanExecuteChanged(sender, EventArgs.Empty)时,它会给我一个异常,说明“调用线程无法访问此对象,因为不同的线程拥有它。”

但是,如果我呼叫System.Windows.Threading.Dispatcher.CurrentDispatcher.CheckAccess则返回True。

我做错了什么?

Private Sub m_Parent_PropertyChanged(ByVal sender As Object, ByVal e As PropertyChangedEventArgs) Handles m_Parent.PropertyChanged
    If System.Windows.Threading.Dispatcher.CurrentDispatcher.CheckAccess Then
        RaiseEvent CanExecuteChanged(sender, EventArgs.Empty)
    Else

    End If
End Sub

2 个答案:

答案 0 :(得分:2)

System.Windows.Threading.Dispatcher.CurrentDispatcher.CheckAccess将始终返回true,因为线程始终可以访问与其关联的Dispatcher。问题是您正在使用后台线程的调度程序而不是正在运行UI的主线程。

如果您需要引发CanExecuteChanged,可以保存对主线程调度程序的引用并使用其Invoke方法。

答案 1 :(得分:2)

Application.Current.Dispatcher.CheckAccess()

另见: Ensuring that things run on the UI thread in WPF