在调用WCF服务后在主UI线程中填充TableView

时间:2013-10-25 21:32:05

标签: c# wcf asynchronous xamarin.ios xamarin

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 ?我必须在这里遗漏一些简单的东西。

1 个答案:

答案 0 :(得分:1)

看起来我只想出来了。 Threading in Xamarin is described here.

我所要做的就是:

//Inside TableViewController
private void Callback(List<MyObject> objects) {
    InvokeOnMainThread(() => {
        ((MyTableViewSource)TableView.Source).AddObjects(objects);
        TableView.ReloadData();
    });
}

InvokeOnMainThreadNSObject上定义,因此您可以像以前一样使用TableView.InvokeOnMainThread来调用它。