3

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

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

这是我的方法:

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()使用然后等待副本完成的惯用方式是什么?

4

1 回答 1

12

如果复制操作针对相同的存储帐户和相同的类型(例如 -> 块 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。如果您希望在这些情况下保持一致的行为,最好的选择是让客户端自己复制 - 从源下载数据并上传到目标。

于 2015-02-11T19:09:57.280 回答