2011-11-09 60 views
-1

我是WPF的新手,有關於調度員和Delegate.Invoke的問題。關於wpf調度員

在Windows窗體應用程序中,我們可以使用invoke方法對其他線程的UI控件進行更改。這是可行的,因爲調用「在擁有該控件的基礎窗口句柄的線程上執行指定的委託」(按照msdn)。

我的問題是:

  1. 爲什麼在WPF不Invoke工作?應該允許對UI進行更改,因爲擁有UI控件的線程可以執行該委託,但仍然會拋出一個運行時異常,該異常「」一個線程試圖修改不同線程擁有的對象「

  2. 調度員如何管理對WPF控件進行更改,而Invoke失敗?

  3. 是否有可能在不使用調度程序或後臺工作的WPF中進行跨線程編程?

回答

1

1)爲什麼不調用wpf工作?

它工作正常,但也許你沒有正確使用它。我建議你閱讀the documentation

應該被允許更改UI與擁有UI控件獲得執行委託線程,但它仍然拋出一個運行時異常,「一個線程試圖修改由不同線程擁有的對象「

也許您在工作線程上創建了一個UI對象,然後試圖將其添加到UI線程的主UI中?沒有看到你的代碼,這只是一個猜測...

2)當調用失敗時,despatcher如何設法更改wpf控件?

這個問題不是很清楚,但它可能與反正第一個問題...

3)是否有可能做WPF跨線程編程,而無需使用調度員或後臺工作?

如果您需要從工作線程操作UI,則必須使用調度程序。 BackgroundWorker也使用調度程序(間接通過ISynchronizationContext接口)在UI線程上引發事件。沒有辦法繞過它。