2017-02-02 7 views
1

Я пытаюсь удалить и воссоздать общий ресурс файла Azure как быстрый способ удалить все содержимое.Как узнать, когда общий ресурс хранилища Azure удален?

Проблема заключается в том, что при попытке немедленно создать новый общий ресурс с тем же именем, что и старый ранее удаленный общий ресурс, он терпит неудачу (с ошибкой 409 конфликтов). Если я подожду около 30 секунд после его удаления, он работает нормально. Я предполагаю, что это связано с тем, что для освобождения имени ресурса требуется время.

Вот мой код:

var targetAccount = new CloudStorageAccount(new StorageCredentials(destination.StorageAccountName, destination.Key), true); 
var targetClient = targetAccount.CreateCloudFileClient(); 
var targetShare = targetClient.GetShareReference(destination.ShareName); 

if (targetShare.Exists()) { 
    var ar = targetShare.BeginDelete(null, null); 
    targetShare.EndDelete(ar); 
} 
Thread.Sleep(30000); 
targetShare.Create(); 

Согласно документации на MSDN, EndDelete, предполагают, чтобы блокировать до удаления была завершена, так почему же не так ли?

Как я могу избежать необходимости ждать фиксированного количества времени для завершения удаления?

(Я также попытался синхронную версию этого, как хорошо, но это делает то же самое)

UPDATE

Попытка несколько различных вещей, я хотел бы видеть тайминги на обратный вызов от BeginDelete, используя этот код:

if (targetShare.Exists()) { 
    Console.WriteLine($"BeginDelete {DateTime.Now:O}"); 
    var ar = targetShare.BeginDelete(result => { 
     Console.WriteLine($"Callback {DateTime.Now:O}"); 
    }, null); 
    targetShare.EndDelete(ar); 

} 

try { 
    targetShare.Create(); 
} catch (Exception ex) { 
    Console.WriteLine(ex.Message); 
} 

Результат:

BeginDelete 2017-02-02T17:42:33.5303589+00:00 
Callback 2017-02-02T17:42:33.6289211+00:00 
The remote server returned an error: (409) Conflict. 
+0

Не прекращает ли процесс «EndDelete» удаление? [Docs] (https://msdn.microsoft.com/en-us/library/microsoft.windowsazure.storage.file.cloudfileshare.enddelete.aspx), похоже, предполагает это. – DavidG

+0

Нет, он возвращает результат процесса удаления. – BG100

+0

Нет, это не так, это асинхронный результат. Для операции [BeginDelete] (https://msdn.microsoft.com/en-us/library/dn723503.aspx) первым параметром является обратный вызов, чтобы сообщить вам, когда он будет завершен. – DavidG

ответ

1

Per официального documentation,

Когда доля удаляются, доля с тем же именем не может быть воссоздана в течение по крайней мере 30 секунд. Пока общий ресурс удаляется, попытки воссоздать часть с тем же именем не будут выполняться с кодом состояния 409 (конфликт), при этом служба возвращает дополнительную информацию об ошибке, указывающую, что этот ресурс удаляется. Все остальные операции, в том числе операции над любыми файлами под общим ресурсом, сбой кода статуса 404 (не найден) при удалении общего ресурса.

В заключение вы можете продолжать повторять попытку Create() в цикле и вызывать ошибку 409, пока ресурс не будет успешно создан.

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

  • Нет связанных вопросов^_^