[英]How do I implement synchronous copying of a single blob in Azure SDK that only has StartCopyFromBlob()?
早期版本的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可以復制的速度。 如果您希望在這些情況下保持一致的行為,最好的選擇是讓客戶端自己復制 - 從源下載數據並上傳到目標。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.