Загрузка нескольких запросов RIA Services одновременно - PullRequest
1 голос
/ 11 мая 2011

Я хочу сделать что-то похожее на приведенное ниже, где я параллельно загружаю некоторые связанные данные для каждой коллекции уже загруженных сущностей:

    foreach (var parentThing in ParentThings)
    {
        Context.Load(Context.GetChildThingForParentQuery(parentThing.Id), op =>
            {
                parentThing.Child = op.Entities.FirstOrDefault();
            }, null);
    }

Однако, похоже, это не работает. Все данные смешиваются в лямбда обратного вызова, например, parentThing всегда является объектом LAST в коллекции, а op.Entities всегда содержит только ПЕРВЫЙ дочерний элемент.

Ответы [ 2 ]

1 голос
/ 11 мая 2011

Проблема с вашим foreach вызвана доступом к измененному закрытию . Попробуйте:

foreach (var temp in ParentThings) 
{
    var parentThing = temp;
    Context.Load(Context.GetChildThingForParentQuery(parentThing.Id), op =>
        {
            parentThing.Child = op.Entities.FirstOrDefault();
        }, null);
}
1 голос
/ 11 мая 2011

Думайте об этом так, потому что это асинхронный момент, когда обратный вызов получен, цикл foreach давно прошел текущий parentThing, и именно поэтому вы получаете смешанные результаты (условия Леманса, я уверен, что кто-то еще сможетдать вам лучший ответ в отношении этого).

В прошлом я видел, что лучше запускать их по очереди и ждать первого результата, прежде чем продолжить, таким образом вы можете сохранить последний запущенный 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);
    }
...