2012-11-22 150 views
0

返回true我的代碼如下:Dispatcher.CheckAccess從非託管工作者線程

public override void Touch() 
    { 
     if (System.Windows.Threading.Dispatcher.CurrentDispatcher.CheckAccess()) 
     { 
      TouchBase(); 
     } 
     else 
     { 
      System.Windows.Application.Current.Dispatcher.BeginInvoke(
        System.Windows.Threading.DispatcherPriority.Send, 
        (Action) (() => TouchBase())); 
     } 
    } 

而且我剛剛得到一個崩潰的if塊(而不是其他塊),因爲有一些事情必須在主線程上完成,調用堆棧清楚地表明這不是主線程,而是非託管IOCP線程。

所以我的問題是,CheckAccess()不工作時從非託管線程或什麼時調用?它真的可以被打破嗎?任何人都有什麼想法發生在這裏。順便說一下,這個問題很少發生,所以建議添加一些日誌記錄並不是那麼有用。

+0

這有點奇怪嗎?你也可以嘗試使用分派器。 VerifyAccess()。這將拋出一個異常,如果沒有訪問和不返回一個布爾。 [驗證訪問](http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.verifyaccess.aspx) – ryadavilli

+0

不容易,它花了大約一個小時才能崩潰。事實上,不,我不能,如果你看看代碼,有時它會被主線程調用,其他的則不會。它需要繼續在這兩種情況下工作,我不想用try {} catch塊和東西來污染該代碼。 –

+0

非常真實。沒有任何幫助。我對這個問題和解決方案很感興趣。 – ryadavilli

回答

0

看來(我需要一段時間才能確定這一點)正確的事情是調用System.Windows.Application.Current.Dispatcher.CheckAccess()來代替。 System.Windows.Dispatcher.CurrentDispatcher()創建一個新的調度程序,如果它沒有設置,這似乎是線程不受管理的情況。

+0

MS doco在這方面可能會更加清晰明確,特別提到當涉及非託管線程的回調時它意味着什麼。 –

0

System.Windows.Threading.Dispatcher.CurrentDispatcher爲您提供當前正在執行線程的的調度程序,而不是用於該應用程序的調度程序的線程。每個線程都有一個調度程序 - 但這不是您正在尋找的調度程序。

System.Windows.Application.Current.Dispatcher是應用程序的主調度程序。如果你在這兩個地方使用它,你應該沒問題。