簡體   English   中英

如何在僅具有StartCopyFromBlob()的Azure SDK中實現單個blob的同步復制?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM