2016-12-05 3 views
0

У меня есть код C# для копирования блоба из одной учетной записи хранилища в другую. Я заметил, что, когда я звоню на CloudBlob.StartCopyAsync, целевое blob's CopyState.Status установлено на CopyStatus.Pending. Есть ли способ получить обновленный статус операции копирования?Как получить обновленное состояние копирования лазурного пятна при использовании blob StartCopyAsync

Я попытался добавить await Task.Delay(TimeSpan.FromSeconds(10)); после вызова, но когда задержка завершается, состояние все еще отображается в ожидании. Если я попытаюсь снова получить blob из контейнера для хранения, я получаю CopyStatus == null.

ответ

1

опрос для копирования свойств Blob: теперь мы предоставляем следующие дополнительные свойства, которые позволяют пользователям отслеживать ход копии, используя Get Blob Properties, Get Blob или List Blobs:

X-MS-копировать-статус (или CopyStatus): текущее состояние операции копирования. Это может быть одно из следующего: в ожидании: операция копирования не ожидается. Успех: операция копирования завершена успешно. aborted: операция копирования была прервана клиентом. не удалось: операция копирования не завершилась из-за ошибки.

x-ms-copy-id (CopyId): идентификатор, возвращаемый операцией копирования, который может использоваться для мониторинга хода выполнения или прервать копию.

x-ms-copy-status-description (CopyStatusDescription): Дополнительная информация об ошибках, которая может использоваться для диагностики.

x-ms-copy-progress (CopyProgress): количество копий, скопированных до сих пор. Это имеет формат X/Y, где X = количество байтов, а Y - общее количество байтов.

x-ms-copy-completion-time (CopyCompletionTime): время завершения последней копии.

Эти свойства можно отслеживать, чтобы отслеживать ход операции копирования, которая возвращает статус «ожидающий». Тем не менее, важно отметить, что кроме операций Put Page, Put Block и Lease Blob любая другая операция записи (т. Е. Put Blob, Put Block List, Set Blob Metadata, Set Blob Properties) в блоке назначения удаляет свойства относящихся к операции копирования.

https://blogs.msdn.microsoft.com/windowsazurestorage/2012/06/12/introducing-asynchronous-cross-account-copy-blob/

Пожалуйста, обратите внимание, что вы должны периодически опрашивать состояние копирования с стороны сервера Azure Storage, await Task.Delay(TimeSpan.FromSeconds(10)); ничего не делает на самом деле.

public static void MonitorCopy(CloudBlobContainer destContainer) 
{ 
    bool pendingCopy = true; 

    while (pendingCopy) 
    { 
     pendingCopy = false; 
     var destBlobList = destContainer.ListBlobs(
      true, BlobListingDetails.Copy); 

     foreach (var dest in destBlobList) 
     { 
      var destBlob = dest as CloudBlob; 

      if (destBlob.CopyState.Status == CopyStatus.Aborted || 
       destBlob.CopyState.Status == CopyStatus.Failed) 
      { 
       // Log the copy status description for diagnostics 
       // and restart copy 
       Log(destBlob.CopyState); 
       pendingCopy = true; 
       destBlob.StartCopyFromBlob(destBlob.CopyState.Source); 
      } 
      else if (destBlob.CopyState.Status == CopyStatus.Pending) 
      { 
       // We need to continue waiting for this pending copy 
       // However, let us log copy state for diagnostics 
       Log(destBlob.CopyState); 

       pendingCopy = true; 
      } 
      // else we completed this pending copy 
     } 

     Thread.Sleep(waitTime); 
    }; 
} 
+0

Спасибо. Вам просто нужно одно изменение. Первый параметр ListBlobs теперь является префиксом, поэтому вам нужно использовать именованные параметры –

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

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