2010-10-09 62 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方法。