从wcf服务获取异步数据

时间:2011-06-27 11:05:11

标签: silverlight wcf

我有一个从数据库中检索信息的wcf。

我还有一个Silverlight客户端应用程序,它引用该服务并使用它来检索数据。

public void init(ref Cluster cluster)
{
    _SelectedCluster = cluster;
    MyEntities svc = new MyEntities(new    Uri("http://localhost:49672/MyDataService.svc/"));
        docs = new DataServiceCollection<EC_Documents>();
        var query = from c in svc.EC_Documents
                    where c.clusterID == _SelectedNode.ID
                    orderby c.clusterID
                    select c;

        docs.LoadCompleted += docs_LoadCompleted;      

    docs.LoadAsync(query);
}
    private void docs_LoadCompleted(object sender, LoadCompletedEventArgs e)
    {
        if (e.Error == null)
        {

            if (docs.Continuation != null)
            {
               docs.LoadNextPartialSetAsync();
            }
            else
            {
                _SelectedCluster.Value = docs.Count;

            }
        }
    }

因为调用是异步的,所以我必须让docs成为该类的成员,并在docs_LoadCompleted方法中检查它的计数。

我还有一个_SelectedCluster,它是Cluster类型的对象,作为类中的成员,它在迭代中保存当前的集群对象。

我在将结果分配给当前选定的节点_SelectedCluster.Value成员时遇到问题。

因为调用是异步的,所以我无法迭代所有的集群对象并同步分配结果。如果我这样做,则赋值始终位于迭代中的最后一个集群上。

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

重新安排您的代码以便从闭包中受益: -

public void init(Cluster cluster)
{
    MyEntities svc = new MyEntities(new    Uri("http://localhost:49672/MyDataService.svc/"));
        var docs = new DataServiceCollection<EC_Documents>();
        var query = from c in svc.EC_Documents
                    where c.clusterID == _SelectedNode.ID
                    orderby c.clusterID
                    select c;

        docs.LoadCompleted += (s, e) =>
        {
            if (e.Error == null)
            {
                if (docs.Continuation != null)
                {
                   docs.LoadNextPartialSetAsync();
                }
                else
                {
                    cluster.Value = docs.Count;
                }
            }
        };      

    docs.LoadAsync(query);
}

现在可以使用自己的实例initDataServiceCollection<EC_Documents>进行多次调用。我不确定你想对我看起来错误的_SelectedNode.ID值做什么,你应该将该值作为参数传递给init。当然,docs现在是本地的,一旦加载了集群ID的所有文档,您将需要决定使用它的内容。