Получение результатов от параллельной работы.Для


Я рассматриваю использование 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, и я помещаю его в массив в правильном порядке. позиция.

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

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

Как я уже сказал выше, я, вероятно, слишком осторожен, но я был обожжен написанием многопоточного кода в более молодые и буйные дни, и я не хочу чтобы снова совершить те же ошибки.

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

2 4

2 ответа:

Выглядит нормально для меня, хотя я думаю, что 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();
    }

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