WPF:CurrentDispatcher.CheckAccess和CanExecuteChanged存在问题
有时,当我从后台线程调用RaiseEvent CanExecuteChangedsender、EventArgs.Empty时,它会给我一个异常,说明调用线程无法访问此对象,因为它是其他线程拥有的 但是,如果调用System.Windows.Threading.Dispatcher.CurrentDispatcher.CheckAccess,则返回True 我做错了什么WPF:CurrentDispatcher.CheckAccess和CanExecuteChanged存在问题,wpf,multithreading,dispatcher,Wpf,Multithreading,Dispatcher,有时,当我从后台线程调用RaiseEvent CanExecuteChangedsender、EventArgs.Empty时,它会给我一个异常,说明调用线程无法访问此对象,因为它是其他线程拥有的 但是,如果调用System.Windows.Threading.Dispatcher.CurrentDispatcher.CheckAccess,则返回True 我做错了什么 Private Sub m_Parent_PropertyChanged(ByVal sender As Object, By
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
System.Windows.Threading.Dispatcher.CurrentDispatcher.CheckAccess将始终返回true,因为线程始终可以访问与其关联的调度程序。问题是您使用的是后台线程的调度程序,而不是运行UI的主线程的调度程序
如果需要引发CanExecuteChanged,可以保存对主线程调度程序的引用,并使用其Invoke方法 System.Windows.Threading.Dispatcher.CurrentDispatcher.CheckAccess将始终返回true,因为线程始终可以访问与其关联的调度程序。问题是您使用的是后台线程的调度程序,而不是运行UI的主线程的调度程序
如果需要引发CanExecuteChanged,可以保存对主线程调度程序的引用,并使用其Invoke方法
另见:
另见:
您能否提供有关从何处引发异常的信息?您暗示对RaiseEvent的调用正在抛出异常,但事实上,它已经处理了CanExecuteChanged事件。堆栈跟踪会很有用。如果它看起来确实来自RaiseEvent,那么这可能意味着异常来自.NET Framework类内部。在这种情况下,右键单击堆栈跟踪,并启用显示“外部代码”的选项,以查看其真正来源。问题是CurrentDispatcher.CheckAccess不是有效的设计模式。您需要检查与接收事件的对象关联的调度程序。您好,我有完全相同的问题,您能详细解释一下引用主线程的调度程序吗?非常感谢。它很难看。真难看。我现在不能进入它,但如果你这个周末给我一个提醒,我会帮你查找代码。grauenwolf@gmail.com.Could请提供异常从何处引发的信息?您暗示对RaiseEvent的调用正在抛出异常,但事实上,它已经处理了CanExecuteChanged事件。堆栈跟踪会很有用。如果它看起来确实来自RaiseEvent,那么这可能意味着异常来自.NET Framework类内部。在这种情况下,右键单击堆栈跟踪,并启用显示“外部代码”的选项,以查看其真正来源。问题是CurrentDispatcher.CheckAccess不是有效的设计模式。您需要检查与接收事件的对象关联的调度程序。您好,我有完全相同的问题,您能详细解释一下引用主线程的调度程序吗?非常感谢。它很难看。真难看。我现在不能进入它,但如果你这个周末给我一个提醒,我会帮你查找代码。grauenwolf@gmail.com.
Application.Current.Dispatcher.CheckAccess()