使用Blob StartCopyAsync时如何获取Azure Blob的更新副本状态

Mic*_*bin 1 c# azure azure-storage-blobs

我有一些C#代码将Blob从一个存储帐户复制到另一个。我注意到,当我调用时CloudBlob.StartCopyAsync,目标Blob的CopyState.Status设置为CopyStatus.Pending。有什么方法可以使我获得复制操作的更新状态?

我曾尝试await Task.Delay(TimeSpan.FromSeconds(10));在通话后添加a ,但延迟结束后,状态仍显示为待定。如果然后尝试从存储容器中重新获取Blob,则会得到CopyStatus == null

Zha*_*oft 5

轮询复制Blob属性:现在,我们提供了以下附加属性,这些属性允许用户使用Get Blob PropertiesGet BlobList Blobs跟踪复制的进度:

x-ms-copy-status(或CopyStatus):复制操作的当前状态。可以是以下之一:挂起:复制操作处于挂起状态。成功:复制操作成功完成。已中止:客户端中止了复制操作。失败:由于错误,复制操作无法完成。

x-ms-copy-id(CopyId):复制操作返回的ID,可用于监视进度或中止复制。

x-ms-copy-status-description(CopyStatusDescription):可用于诊断的其他错误信息。

x-ms-copy-progress(CopyProgress):到目前为止已复制的Blob数量。它具有X / Y格式,其中X =复制的字节数,Y是字节总数。

x-ms-copy-completion-time(CopyCompletionTime):最后一个副本的完成时间。

可以监视这些属性以跟踪返回“待处理”状态的复制操作的进度。但是,需要注意的是,除了“放置页面”,“放置块”和“租赁Blob”操作之外,目标Blob上的任何其他写入操作(即“放置Blob”,“放置块列表”,“设置Blob元数据”,“设置Blob属性”)都将删除这些属性。关于复制操作。

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

请注意,您需要定期从Azure存储服务器端轮询复制状态,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);
    };
}
Run Code Online (Sandbox Code Playgroud)