2011-02-07 2 views
4

Я использую 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. Я смутно помню, что он много жалуется на многопоточный код. Какие-нибудь дополнительные проблемы, с которыми я могу столкнуться?

ответ

3

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

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

+0

Это отчасти причина, я хочу использовать Parallel.For Если я должен сделать 10 обслуживания вызовов и каждый занимает около От 4 до 7 секунд, чтобы вернуться, то это 40-70 секунд, чтобы получить эти данные. Если я могу вызвать их параллельно, и результат, который каждый вызов составляет в среднем 6-9 секунд, но я могу сделать 5 звонков сразу, то это от 12 до 18 секунд. Значительная экономия. –

+0

Однако мои проблемы с ASP.NET были более похожими на то, что они бросали исключения, потому что материал происходил на «неправильном» потоке или том, о котором он не знал. Это всего лишь смутное чувство от того, что я видел однажды пару лет назад по очень изворотливому коду, но с тех пор так и не был. –

Смежные вопросы