Получение результатов от Parallel.For - PullRequest
4 голосов
/ 07 февраля 2011

Я смотрю на использование Parallel.For для вызова веб-службы, для возврата которой требуется некоторое время, однако мы знаем, что можем вызывать его много раз одновременно, и это не займет намного больше времени, чем один звонок.

С этой целью я пробую Parallel.For и очень хочу проверить свои идеи о том, как это будет работать.Я, вероятно, немного чрезмерно осторожен, поскольку не хочу испортить приложение, и я хочу убедиться, что, если мы пойдем этим путем, вся команда приложения будет знать, что нужно сделать при доступе к параллельному коду.

В любом случае, вот мое текущее понимание и работа.

public IEnumerable<HotelAvail> GetAvailability (IList<string> codes, DateTime startDate, int numNights)
{
    HotelAvail[] result = new HotelAvail[codes.Count];

    Parallel.For(0, codes.Count, i =>
        {
            string code = codes[i];
            result[i] = new AvailService().
                GetAvailability(
                    code, startDate, numNights);
        });

    return result;
}

AvailService получает доступность номеров на указанный диапазон дат (startDate + numNights).code является идентификатором свойства.

Я установил массив результатов правильного размера в начале с большим количеством пустых слотов.

Затем я вызываю службу параллельно.Служба создает новый объект HotelAvail, и я помещаю его в массив в правильной позиции.

Когда все будет сделано, я возвращаю массив.К этому моменту он должен быть полностью заселен.Там не должно быть никаких пробелов.Служба не влияет ни на какую другую часть состояния системы - она ​​просто создает вызов веб-службы, вызывает его и возвращает объект результата.

Есть ли какие-либо проблемы с этим, которых я не вижу.

Как я уже говорил выше, я, вероятно, был слишком осторожен, но я был горен написанием многопоточного кода в более юные и бурные дни, и я не хочу повторять те же ошибки снова.1025 * Кроме того, этот код в конечном итоге окажется в приложении ASP.NET.Я смутно припоминаю, что он много жалуется на многопоточный код.Какие-нибудь дополнительные проблемы, с которыми я мог бы столкнуться там?

Ответы [ 2 ]

3 голосов
/ 07 февраля 2011

Мне кажется, все в порядке, хотя я думаю, что PLINQ будет немного элегантнее:

    public IEnumerable<HotelAvail> GetAvailability (IList<string> codes, 
                                                    DateTime startDate, 
                                                    int numNights)
    {
        return codes.AsParallel().AsOrdered().Select(code => 
                 new AvailService().GetAvailability(code, startDate, numNights))
                .ToList();
    }
1 голос
/ 07 февраля 2011

Для вопроса Asp.net вы можете столкнуться с истечением времени ожидания приложения, если ваш вызов метода не возвращается быстро.Для этого сценария вы можете вызывать метод, использующий AJAX для каждого кода, возвращая объект HotelAvail по завершении вызова веб-службы, обновляя свой интерфейс новой информацией, когда она доступна.

...