【问题标题】:How to get updated copy state of azure blob when using blob StartCopyAsync使用 blob StartCopyAsync 时如何获取 azure blob 的更新复制状态
【发布时间】:2016-12-05 10:32:14
【问题描述】:

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

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

【问题讨论】:

    标签: c# azure azure-blob-storage


    【解决方案1】:

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

    x-ms-copy-status(或CopyStatus):复制操作的当前状态。它可以是以下之一: 待处理:复制操作待处理。 成功:复制操作成功完成。 aborted:复制操作被客户端中止。 failed: 由于错误,复制操作未能完成。

    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):上一次拷贝的完成时间。

    可以监视这些属性以跟踪返回“待处理”状态的复制操作的进度。但是,需要注意的是,除了 Put Page、Put Block 和 Lease Blob 操作之外,目标 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 存储服务器端轮询复制状态,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);
        };
    }
    

    【讨论】:

    • 谢谢。你只需要一个改变。 ListBlobs 第一个参数现在是前缀,所以你需要使用命名参数
    猜你喜欢
    • 1970-01-01
    • 2020-03-10
    • 1970-01-01
    • 2016-02-12
    • 2023-02-21
    • 2018-07-06
    • 2019-11-23
    • 2017-07-29
    • 1970-01-01
    相关资源
    最近更新 更多