早期版本的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()
然后等待副本完成的惯用方法是什么?
答案 0 :(得分:11)
如果复制操作适用于相同的存储帐户且类型相同(例如 - >阻止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可以复制的速度。如果您希望在这些情况下保持一致的行为,最好的选择是让客户端自己复制 - 从源下载数据并上传到目的地。