我有一个从数据库中检索信息的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成员时遇到问题。
因为调用是异步的,所以我无法迭代所有的集群对象并同步分配结果。如果我这样做,则赋值始终位于迭代中的最后一个集群上。
有什么建议吗?
答案 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);
}
现在可以使用自己的实例init
对DataServiceCollection<EC_Documents>
进行多次调用。我不确定你想对我看起来错误的_SelectedNode.ID
值做什么,你应该将该值作为参数传递给init
。当然,docs
现在是本地的,一旦加载了集群ID的所有文档,您将需要决定使用它的内容。