Azure Search SDK для хранилища BLOB-объектов - удаление файлов
Я создал приложение, которое перечисляет все документы в контейнере хранилища Azure и позволяет пользователю отмечать определенные файлы для удаления.
Это приложение поиска Azure, поэтому процесс заключается в добавлении свойства "удаленных" метаданных к выбранным файлам, запуске индексатора для удаления этой информации из индекса и последующем физическом удалении файлов.
Вот код для этого процесса:
serviceClient.Indexers.Run(documentIndexer);
var status = serviceClient.Indexers.GetStatus(documentIndexer).LastResult.Status;
// Loop until the indexer is done
while (status == IndexerExecutionStatus.InProgress)
{
status = serviceClient.Indexers.GetStatus(documentIndexer).LastResult.Status;
}
// If successful, delete the flagged files
if (status == IndexerExecutionStatus.Success)
{
DeleteFlagged();
}
Все работает нормально, но только если я ставлю точку останова на вызов DeleteFlagged(), эффективно форсируя задержку между запуском индексатора и удалением файлов.
Без паузы индексатор возвращается как успешный, и я удаляю файлы, но содержимое файла не было удалено из индекса - они по-прежнему отображаются в результатах поиска (файлы были физически удалены).
Есть ли что-то еще, что мне нужно проверить перед удалением?
1 ответ
Когда вы запускаете индексатор, он не сразу переходит в состояние InProgress - фактически, в зависимости от того, сколько индексаторов запущено в вашей службе, может пройти значительная задержка, прежде чем индексатор будет запланирован для запуска. Таким образом, когда вы вызываете GetStatus перед циклом, индексатор может еще не быть InProgress, и вы в конечном итоге удаляете BLOB-объекты слишком рано. Более надежный подход состоит в том, чтобы подождать, пока индексатор завершит этот конкретный прогон (например, просмотрев StartTime/EndTime в LastResult).