C# 如何在Azure SDK中同步复制只有StartCopyFromBlob()的单个blob?
Azure SDK的早期版本有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
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最终会解决?