C# 如何在Azure SDK中同步复制只有StartCopyFromBlob()的单个blob?

C# 如何在Azure SDK中同步复制只有StartCopyFromBlob()的单个blob?,c#,.net,azure-storage,azure-storage-blobs,azure-sdk-.net,C#,.net,Azure Storage,Azure Storage Blobs,Azure Sdk .net,Azure SDK的早期版本有CloudBlob.CopyFromBlob(),它是同步的,我们在代码中使用它。我们现在需要转到SDK 2.4,那里没有这样的方法,而是有CloudBlockBlob.StartCopyFromBlob()返回一些神奇的令牌,我们可以使用它来检查复制是如何完成的 在我们的代码中对blob进行“后台”复制是没有意义的——同步地进行复制就可以了,因此最好使用新SDK中的东西实现一个与旧的CopyFromBlob()等效的复制 以下是我的方法: CloudBlockBl

Azure SDK的早期版本有
CloudBlob.CopyFromBlob()
,它是同步的,我们在代码中使用它。我们现在需要转到SDK 2.4,那里没有这样的方法,而是有
CloudBlockBlob.StartCopyFromBlob()
返回一些神奇的令牌,我们可以使用它来检查复制是如何完成的

在我们的代码中对blob进行“后台”复制是没有意义的——同步地进行复制就可以了,因此最好使用新SDK中的东西实现一个与旧的
CopyFromBlob()
等效的复制

以下是我的方法:

CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(sourcePath);
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(targetPath);
var copyToken = targetBlob.StartCopyFromBlob(sourceBlob.Uri);
while( true ) {
    System.Threading.Thread.Sleep(100);
    CloudBlockBlob target = targetContainer.GetBlockBlobReference(targetPath);
    bool greatSuccess = false;
    switch( target.CopyState.Status ) {
        case CopyStatus.Success:
            greatSuccess = true;
            break;
        case CopyStatus.Pending:
            continue;
        default:
            throw new Exception( "Failed to copy" );
    }
    if( success ) {
        break;
    }
}
看起来很有效,但是我不确定里面没有潜在的问题


使用StartCopyFromBlob()然后等待复制完成的惯用方法是什么?

如果复制操作针对相同的存储帐户和相同的类型(例如->阻止blob以阻止blob在相同的存储帐户中复制),复制是同步的,当StartCopyFromBlob()返回时,可以预期复制操作已经完成。您还可以通过将targetBlob.CopySate值检查为成功来验证它

CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(sourcePath);
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(targetPath);
var copyToken = targetBlob.StartCopyFromBlob(sourceBlob.Uri);
if(targetBlob.CopyState.Status == CopyStatus.Success)
{
    // Copy completed successfully
}

对于所有其他场景(跨存储帐户,甚至跨同一存储帐户内的类型),复制操作是异步的,并使用后台的备用资源来执行。目前,该服务并没有提供一个关于它可以复制多快的SLA。如果你想在这些情况下保持一致的行为,最好的选择是让客户端自己复制-从源下载数据并上传到目的地。

问题是,它会尽你的服务器所能快速向Azure发送请求…@usr:Ouch,我忘了原型代码中的延迟。这确实非常重要,因为交易成本可能会成为账单的主要部分。@sharptooth,您是在同一存储帐户内复制Blob还是跨存储帐户复制Blob?@Vinaysha Microsoft使用同一存储帐户。我想我需要先检索
CopyState
,然后再进行检查。StartCopyFromBlob api调用应刷新您的CopyState状态。@Vinaysha Microsoft如果我在中将CloudPageBlob复制到CloudBlockBlob相同的存储帐户,当
StartCopyFromBlob()
返回时是否也会完成?另外,当你说
StartCopyFromBlob()
刷新复制状态时,这是否意味着如果我有一个循环在运行,它监视完成状态,例如
while(targetBlob.CopyState.status==CopyStatus.Pending){Task.Delay(100);}
if最终会解决?