早期版本的Azure SDK有CloudBlob.CopyFromBlob()
,它是同步的,我們在我們的代碼中使用。我們現在需要轉移到SDK 2.4,並且沒有這種方法,而是有CloudBlockBlob.StartCopyFromBlob()
,它返回一些魔法令牌,我們可以使用它來檢查副本是如何完成的。如何在只有StartCopyFromBlob()的Azure SDK中實現同步複製單個blob?
在我們的代碼中「背景」複製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()
,然後等待複製完成的慣用方式?
這樣做的一個問題是,它向您的服務器發送垃圾郵件請求的速度與您的服務器的速度一樣快...... – usr 2015-02-10 09:04:36
@usr:Ouch,我忘記了原型代碼中的延遲。這確實非常重要,因爲交易成本可能成爲該法案的主要部分。 – sharptooth 2015-02-10 09:08:40
@sharptooth,你是在同一個存儲帳戶或跨存儲帳戶複製blob嗎? – 2015-02-10 22:50:04