C# + Azure Storage blobs: StorageException: в настоящее время существует ожидающая операция копирования

У меня есть сервер, который получает 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?

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

Можно попробовать проверить backupFile.CopyState.Status?

DavidG 18.12.2018 10:35
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
1 089
1

Ответы 1

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

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

Обновлять

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

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

Фактически, токен отмены может только отменить операцию CloudBlob.StartCopyAsync до того, как было начато копирование. Если асинхронное копирование было запущено на стороне сервера, вам необходимо прервать процесс копирования, вызвав метод CloudBlob.AbortCopyAsync.

Zhaoxing Lu 18.12.2018 12:46

Другие вопросы по теме