调用 WCF 服务后,在主 UI 线程中填充表视图
本文关键字:线程 填充 视图 UI 在主 WCF 服务 调用 | 更新日期: 2023-09-27 18:37:03
在Xamarin(C#)中,我有一个用SlSvcUtil生成的WCF服务.exe它是用BasicHttpBinding调用的。这一切都有效。我所做的只是注册一个回调,调用服务,然后等待数据。
这部分并不重要,但我们必须包装我们的对象才能让 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 线程并填充我的表视图?我一定在这里错过了一些简单的东西。
看来我刚刚想通了。此处介绍了 Xamarin 中的线程。
我所要做的就是:
//Inside TableViewController
private void Callback(List<MyObject> objects) {
InvokeOnMainThread(() => {
((MyTableViewSource)TableView.Source).AddObjects(objects);
TableView.ReloadData();
});
}
InvokeOnMainThread
是在NSObject
上定义的,所以你可以调用它,而不是像我之前尝试的那样使用TableView.InvokeOnMainThread
。