我想做类似下面的事情,我将并行加载已经加载的实体的每个集合的一些相关数据:
foreach (var parentThing in ParentThings)
{
Context.Load(Context.GetChildThingForParentQuery(parentThing.Id), op =>
{
parentThing.Child = op.Entities.FirstOrDefault();
}, null);
}
然而,它似乎不起作用。数据在回调lambda中混合,例如parentThing始终是集合中的LAST对象,op.Entities始终只包含FIRST子节点。
答案 0 :(得分:1)
以这种方式思考,因为它是异步的,收到回调的时间是foreach循环早已通过当前的parentThing,这就是为什么你得到混合的结果(Lemans术语,我相信其他人将能够给你一个更好的答案)。
我在过去看到最好一个接一个地关闭它们并等待第一个结果然后继续,这样你就可以将最后一个被激活的parentThing保存在一个全局变量或类似的东西中,你会收到正确的儿童实体。
int counter = 0;
object lastParentThing;
protected void loopParentThings()
{
lastParentThing = ParentThings[counter];
counter++;
Context.Load(Context.GetChildThingForParentQuery(lastParentThing.Id), op =>
{
lastParentThing.Child = op.Entities.FirstOrDefault();
loopParentThings()
},
null);
}
答案 1 :(得分:1)
foreach
的问题是由accessing a modified closure引起的。尝试:
foreach (var temp in ParentThings)
{
var parentThing = temp;
Context.Load(Context.GetChildThingForParentQuery(parentThing.Id), op =>
{
parentThing.Child = op.Entities.FirstOrDefault();
}, null);
}