2015-02-16 3 views
0

Я использую Azure Search Client Library, и я хочу вызвать запрос несколько раз параллельно с различными параметрами запроса. Когда я пытаюсь это сделать, я получаю исключение:Использование Azure-Search-Client-Library с параллельными задачами

«Коллекция была изменена, операция перечисления не может выполняться».

Я обработал проблему, добавив объект SemaphoreSlim перед вызовом, который мешает нескольким потокам выполнять запрос в одно и то же время. Однако это решение удваивает время выполнения.

private static readonly SemaphoreSlim syncLock = new SemaphoreSlim(1); 
.... 

    await syncLock.WaitAsync(); 
    result = await SearchClient.Indexes[IndexName].QueryAsync<MyIndex>(queryParams); 
    syncLock.Release(); 

Поскольку каждый запрос является независимым вызовом, я полагаю, что потоки не должны затрагиваться друг другом?

ответ

1

За дверью имеется общий перечислимый объект, в котором перечислены индексы, созданные в службе. Если в памяти индекса, который вы пытаетесь получить, нет ссылки, он будет создан после получения статистики, схемы и некоторых других свойств от вашего имени, полностью прозрачных для пользователя. Однако эта операция, если она выполняется в другом потоке параллельно несколько раз, выдает это исключение. Большое спасибо за эту обратную связь, я стараюсь обновить библиотеку как можно скорее и обработать эту ситуацию соответствующим образом. До тех пор (я подозреваю, что это может занять пару дней), пожалуйста, продолжайте использовать решение семафоров, которое отлично работает. Еще раз спасибо! Alex

+0

Большое спасибо :) – doorman

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