C # + BLOB-объекты хранилища Azure: StorageException: в данный момент выполняется операция копирования - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть сервер, который получает URL-адрес файла большого двоичного объекта Azure (только для чтения 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)

Я думаю, потому что асинхронная копия еще не закончена...

Возможно ли это решить с помощью асинхронной команды удаления, которая будет выполняться после выполнения команды копирования?

Любое другое решение будет приветствоваться.Спасибо!

1 Ответ

0 голосов
/ 18 декабря 2018

Я бы посоветовал вам попробовать перегрузку StartAsyncCopy(), которая принимает CancellationToken .После использования этой перегрузки вы сможете отменить операцию копирования через CancellationTokenSource из CancellationToken , который вы использовали при вызове метода.

См. CloudBlockBlob.StartCopyAsync Method для всех доступных перегрузок.И вы также можете взглянуть на CancellationTokenSource Class о том, как использовать механизм отмены.

Обновление

Как упоминалось в комментарии ниже,Вы также должны взглянуть на CloudBlob.AbortCopyAsync(), если операция уже началась.

Надеюсь, это поможет!

...