У меня есть сервер, который получает URL-адрес лазурного файла большого двоичного объекта (только для чтения SAS) и копирует его в другой большой двоичный объект в другой учетной записи хранилища. Команда копирования - это асинхронная команда (StartCopyAsync()
).
Копирование файла - это только одно, что делает этот сервер, он делает еще кое-что. Если одно (или несколько) вычислений не удалось, генерируется исключение.
Когда возникло исключение, я делаю откат, то есть удаляю файл, который я скопировал на первом этапе. Я делаю это так:
await backupFile.DeleteIfExistsAsync();
Я получаю этот код ошибки:
System.AggregateException: One or more errors occurred. (There is currently a pending copy operation.)
---> Microsoft.WindowsAzure.Storage.StorageException: There is currently a pending copy operation.
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteAsyncInternal[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext, CancellationToken token) at Microsoft.WindowsAzure.Storage.Blob.CloudBlob.DeleteIfExistsAsync(DeleteSnapshotsOption deleteSnapshotsOption, AccessCondition accessCondition, BlobRequestOptions options, OperationContext operationContext, CancellationToken cancellationToken)
Я предполагаю, потому что асинхронная копия еще не закончена ...
Можно ли решить эту проблему с помощью команды async Delete, которая произойдет после выполнения команды Copy?
Любое другое решение будет приветствоваться. Спасибо!
Я предлагаю вам попробовать перегрузку StartAsyncCopy()
, которая принимает CancellationToken. После использования этой перегрузки вы сможете отменить операцию копирования через CancellationTokenSource из CancellationToken, который вы использовали при вызове метода.
См. CloudBlockBlob.StartCopyAsync - метод для всех доступных перегрузок. И вы также можете взглянуть на CancellationTokenSource - класс о том, как использовать механизм отмены.
Обновлять
Как упоминается в комментарии ниже, вам также следует взглянуть на CloudBlob.AbortCopyAsync()
, если операция уже началась.
Надеюсь, поможет!
Фактически, токен отмены может только отменить операцию CloudBlob.StartCopyAsync
до того, как было начато копирование. Если асинхронное копирование было запущено на стороне сервера, вам необходимо прервать процесс копирования, вызвав метод CloudBlob.AbortCopyAsync
.
Можно попробовать проверить
backupFile.CopyState.Status
?