Я использую Parallel.For
для вызова веб-службы, которая требует времени для возврата, однако мы знаем, что мы можем вызывать ее много раз одновременно, и это не займет много времени, один звонок.Получение результатов от 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
, и я помещаю его в массив в правильном положении.
Когда все сделано, я возвращаю массив. К этому моменту он должен быть полностью заполнен. Не должно быть пробелов. Служба не влияет на какую-либо другую часть состояния системы - она просто создает вызов веб-службы, вызывает ее и возвращает объект результата.
Есть ли проблемы с этим, что я не вижу.
Как я уже говорил выше, я, вероятно, чересчур осторожен, но я был сожжен с написанием многопоточного кода в более юные и изобильные дни, и я не хочу повторять те же ошибки.
Кроме того, этот код в конечном итоге окажется в приложении ASP.NET. Я смутно помню, что он много жалуется на многопоточный код. Какие-нибудь дополнительные проблемы, с которыми я могу столкнуться?
Это отчасти причина, я хочу использовать Parallel.For Если я должен сделать 10 обслуживания вызовов и каждый занимает около От 4 до 7 секунд, чтобы вернуться, то это 40-70 секунд, чтобы получить эти данные. Если я могу вызвать их параллельно, и результат, который каждый вызов составляет в среднем 6-9 секунд, но я могу сделать 5 звонков сразу, то это от 12 до 18 секунд. Значительная экономия. –
Однако мои проблемы с ASP.NET были более похожими на то, что они бросали исключения, потому что материал происходил на «неправильном» потоке или том, о котором он не знал. Это всего лишь смутное чувство от того, что я видел однажды пару лет назад по очень изворотливому коду, но с тех пор так и не был. –