在 Xamarin(C#)中,我有一个 WCF服务生成 SlSvcUtil.exe ,使用 BasicHttpBinding < / strong>即可。这一切都有效。我所做的就是注册回调,调用服务,然后等待数据。
这部分并不重要,但我们必须包装我们的对象才能让 WCF 发挥得更好。所以我创建了一个包装 WCF 调用的函数,并返回一个未解包的对象列表。这一切都有效。
问题是,我正试图从 TableViewController 内部或 TableViewSource 内部开始工作。如果我所有的回调都是如下所示,那就可以了:
//Inside TableViewSource
private void Callback(List<MyObject> objects) {
for (int i = 0; i < objects.Count; i++) {
_items.Add(objects[i]);
}
}
但是,我仍然需要致电TableView.ReloadData()
。调用此方法失败,因为我不在主UI线程上。有TableView.BeginInvokeOnMainThread(NSAction action)
函数,但 NSAction 无法获取参数,因此我无法返回列表。
我也试过发布通知,但由于同样的原因而失败(可能是因为我在回调中发布):
//Inside TableViewController
private void PropertyChanged(NSNotification notification) {
TableView.ReloadData();
// or TableView.BeginInvokeOnMainThread(() => TableView.ReloadData());
}
//Inside TableViewSource
private void Callback(List<MyObject> objects) {
//work here
NSNotificationCenter.DefaultCenter.PostNotificationName("Objects", this);
}
如何将我的列表传递到主UI线程并填充 TableView ?我必须在这里遗漏一些简单的东西。
答案 0 :(得分:1)
看起来我只想出来了。 Threading in Xamarin is described here.
我所要做的就是:
//Inside TableViewController
private void Callback(List<MyObject> objects) {
InvokeOnMainThread(() => {
((MyTableViewSource)TableView.Source).AddObjects(objects);
TableView.ReloadData();
});
}
InvokeOnMainThread
在NSObject
上定义,因此您可以像以前一样使用TableView.InvokeOnMainThread
来调用它。