如何在仅具有StartCopyFromBlob()的Azure SDK中实现单个blob的同步复制?

sha*_*oth 2 .net c# azure-storage azure-storage-blobs azure-sdk-.net

早期版本的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;
    }
}
Run Code Online (Sandbox Code Playgroud)

它看起来很有效,但我不确定那里没有潜在的问题.

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

小智 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
}
Run Code Online (Sandbox Code Playgroud)

对于所有其他方案(跨存储帐户或甚至跨同一存储帐户中的类型),复制操作是异步的,并使用后台中的备用资源来执行.目前,服务没有提供SLA可以复制的速度.如果您希望在这些情况下保持一致的行为,最好的选择是让客户端自己复制 - 从源下载数据并上传到目标.