2012-03-03 31 views
42

這些都不工作:無法轉換lambda表達式鍵入「System.Delegate」

_uiDispatcher.Invoke(() => { }); 
_uiDispatcher.Invoke(delegate() { }); 

所有我想要做的就是調用我的主UI線程內聯方法。所以我打電話給主線:

_uiDispatcher = Dispatcher.CurrentDispatcher; 

現在我想從另一個線程執行該線程上的一些代碼。我該怎麼做?我使用錯誤的語法嗎?

請注意,這是而不是一個WPF應用程序;我引用了WindowsBase,所以我可以訪問Dispatcher類。

+0

訪問的是什麼類型'_uiDispatcher'?你使用了UI的同步對象嗎? – IAbstract 2012-03-03 20:33:22

+0

'uiDispatcher'是http://msdn.microsoft.com/en-us/library/system.windows.threading.dispatcher.aspx的一個實例。我認爲這是從'_uiDispatcher = Dispatcher.CurrentDispatcher'隱含的。 「用戶界面」沒有同步對象AFAIK ....但我將如何使用它?那會對我做什麼? – mpen 2012-03-03 20:39:48

+0

啊...好吧,我不認爲線程調度員會工作。這是一個WinForm應用程序嗎? – IAbstract 2012-03-04 00:36:58

回答

53

問題是您沒有提供您想要調用的代理的確切類型Dispatcher.Invoke只需要一個Delegate。這是一個Action<T>?如果是這樣,T是什麼?這是一個MethodInvokerAction?什麼?

如果您的委託不接受任何參數並且不返回任何內容,則可以使用ActionMethodInvoker。試試這個:

_uiDispatcher.Invoke(new Action(() => { })); 
+0

我想我習慣了接受委託提供簽名的大多數方法,所以我不需要指定一個。這是有道理的。謝謝! – mpen 2012-03-03 20:05:33

+1

我不認爲這是我的想法。該方法似乎從未被調用;我猜WPF通常會爲你處理並定期執行這些方法?也許我應該只是一個'隊列',然後自己管理它... – mpen 2012-03-03 20:10:31

1

除非我錯過了什麼,你告訴我們,所有的是,這是不是一個WPF應用程序。我不認爲調度員是正確的類。

如果這是一個WinForm的應用程序,你的UI線程可以通過WindowsFormsSynchronizationContext

+0

它不是一個WinForm應用程序;我正在使用OpenGL。 OpenGL使用GL上下文,並且只能從創建它的同一個線程中繪製。我試圖想出一種方法來在主線程上運行一些東西......我以前在WPF應用程序中使用過「Dispatcher」,所以我想我可以再次使用它來解決此問題。 – mpen 2012-03-04 21:01:34

4
this.Dispatcher.Invoke((Action)(() => { textBox1.Text = "Test 123"; })); 
相關問題