注意:我甚至在询问之前就找到了解决问题的方法 问题,但我仍然想知道为什么它会像这样。
我正在使用async/await
,Mvvm
执行通常的xamarin.iOS应用程序,...在技术方面没什么特别的。
我发现以下代码(使用method group
)并不起作用:
ViewModel.PropertyChanged += (sender, e) => {
if (e.PropertyName != "MyProperty")
return;
InvokeOnMainThread (tableViewController.TableView.ReloadData);
};
如果我在InvokeOnMainThread
上设置断点,我可以看到异常:
但使用lambda expression
的相同代码可以正常工作。
ViewModel.PropertyChanged += (sender, e) => {
if (e.PropertyName != "MyProperty")
return;
InvokeOnMainThread (() => tableViewController.TableView.ReloadData ());
};
我的一部分怀疑是一个错误,另一部分已经归咎于我的无知。谁知道哪个部分是对的?
答案 0 :(得分:5)
如果你仔细观察你得到的例外情况,你会看到:
tableViewController.TableView MonoTouch.UIKit.UIKitThreadAccessException [...]
问题是你在后台线程上获取了TableView属性(必须完成以便为ReloadData方法创建一个委托)。
答案 1 :(得分:0)
tableView是UI元素,你不能从非UI线程访问ui元素(或他的属性)。