Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF:CurrentDispatcher.CheckAccess和CanExecuteChanged存在问题_Wpf_Multithreading_Dispatcher - Fatal编程技术网

WPF:CurrentDispatcher.CheckAccess和CanExecuteChanged存在问题

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

有时,当我从后台线程调用RaiseEvent CanExecuteChangedsender、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
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()