2

注意:甚至在提出问题之前,我就找到了解决问题的方法,但我仍然想知道为什么它会这样。

我正在做一个普通的 xamarin.iOS 应用程序,使用async/await, Mvvm, ... 在技术方面没什么特别的。

我发现以下代码(使用 a method group)不起作用:

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

如果我在 上设置断点InvokeOnMainThread,我可以看到异常:

在此处输入图像描述

但是带有 a 的相同代码lambda expression就可以了。

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

我的一部分在怀疑一个错误,另一部分已经在责怪我的无知。有谁知道哪个部分是正确的?

4

2 回答 2

5

如果您更仔细地查看您得到的异常,您会看到:

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

问题是您正在后台线程上获取 TableView 属性(必须这样做才能创建 ReloadData 方法的委托)。

于 2013-10-03T10:58:01.087 回答
0

tableView 是 UI 元素,不能从非 UI 线程访问 ui 元素(或他的属性)。

于 2013-10-03T10:19:45.147 回答