Получение результатов от параллельной работы.Для
Я рассматриваю использование 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 ответа:
Выглядит нормально для меня, хотя я думаю, что 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
по завершении вызова веб-службы и обновляя пользовательский интерфейс с новой информацией, когда она доступна.