2013-10-03 16 views
2

注意:我發現了一個解決辦法,以我的問題,甚至問 問題之前,但我仍然不知道爲什麼會這樣的表現。InvokeOnMainThread不`方法工作group`

我在做一個平常xamarin.iOS應用程序,使用async/awaitMvvm,...沒有在技術方面看中。

我發現下面的代碼(使用method group)不工作:

ViewModel.PropertyChanged += (sender, e) => { 
    if (e.PropertyName != "MyProperty") 
     return; 
    InvokeOnMainThread (tableViewController.TableView.ReloadData); 
}; 

如果我把一個斷點InvokeOnMainThread,我可以看到異常:

enter image description here

但與lambda expression相同的代碼工作得很好。

ViewModel.PropertyChanged += (sender, e) => { 
    if (e.PropertyName != "MyProperty") 
     return; 
    InvokeOnMainThread (() => tableViewController.TableView.ReloadData()); 
}; 

我的一部分懷疑是一個bug,另一部分已經責怪我的無知。任何人都知道哪一部分是對的?

+0

我假設'ReloadData'按預期返回void?它不返回說.. int或布爾? –

+0

是的,它是無效的。兩種語法都是有效的,並且編譯得很好。一個在UI線程中運行,另一個不在。 –

+0

奇怪..你不會期望它與Action或Expression有不同的表現。我不是Mono開發者......但我甚至找不到適當的InvokeOnMainThread方法文檔或任何有關每個重載如何工作的正確解釋。從Windows開發人員..我不會指望它有不同的表現。 –

回答

5

如果你得到的異常仔細看看,你會看到這一點:

tableViewController.TableView MonoTouch.UIKit.UIKitThreadAccessException [...] 

的問題是,您要提取的TableView中屬性(它是爲了創造一個做委託給ReloadData方法)在後臺線程上。

+0

這是有道理的!實際上'TableView' getter中有'UIApplication.EnsureUIThread();'。 –

0

tableView是UI元素,你不能從UI線程訪問UI元素(或他的屬性)。

+0

這就是爲什麼它被包裝在一個'InvokeOnMainThread()'調用 –

+0

哦,你是對的。我誤解了你的答案。 –