2010-10-09 63 views
1

有时,当我从背景线程调用RaiseEvent CanExecuteChanged(sender, EventArgs.Empty)时,它给了我一个异常,声明“调用线程不能访问此对象,因为不同的线程拥有它”。WPF:CurrentDispatcher.CheckAccess和CanExecuteChanged出现问题

但是,如果我拨打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 
+0

能否请您提供关于在异常被抛出从信息?你暗示对RaiseEvent的调用抛出异常,但事实上,它将处理你的CanExecuteChanged事件。堆栈跟踪将很有用。如果它看起来确实来自RaiseEvent,那么可能意味着该异常来自.NET Framework类。在这种情况下,右键单击堆栈跟踪,然后启用该选项以显示“外部代码”以查看其来源。 – 2010-11-04 23:22:37

+0

问题是'CurrentDispatcher.CheckAccess'不是有效的设计模式。您需要检查与接收事件的对象关联的调度程序。 – 2010-11-07 10:02:03

+0

嗨, 我有完全相同的问题,你可以请详细解释引用主线程的调度? 非常感谢。 – 2011-03-08 07:24:48

回答

2

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

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