1

以前はコピー BLOB を開始していましたが、コピーの進行中にコピー先 BLOB の数バイト (最初の 512 バイトなど) を読み取ることができました。コピー BLOB を開始し、コピーの進行中に最初の 512 バイトを読み取る以下のコードを参照してください。

しかし現在、blobStream.Read は、実際のバイトではなく、常にデータ バッファーをゼロで埋めます。最新の azure ストレージ クライアント ライブラリも試しましたが、出力は同じです。しかし、コピーが完了するとすぐに、実際のバイトを読み取ることができます。

これが最新の azure ストレージ サービスで導入されたバグであるかどうか、および考えられる回避策 (ある場合) を教えてください。

CloudBlobClient client = CloudStorageAccount.Parse(
    string.Format(
        "DefaultEndpointsProtocol={0};AccountName={1};AccountKey={2}",
        "http",
        "<destination-account-name>",
        "<destination-account-key>"
    )
).CreateCloudBlobClient();


var vhdsContainer = client.GetContainerReference("<destination-container-name>");
CloudBlob destinationBlob = vhdsContainer.GetPageBlobReference("test-1-b5c1d3f4-23d5-40e4-adc7-236553f8d62d-1.vhd");
destinationBlob.StartCopyFromBlob(
    new Uri("http://<source-storage>.blob.core.windows.net/<source-container-name>/test-4-d803ca0a-5d98-4be8-8895-2a9d15ec3974-1.vhd"), null, null, null);


CloudBlob destBlob = vhdsContainer.GetBlobReference("test-1-b5c1d3f4-23d5-40e4-adc7-236553f8d62d-1.vhd");
int maxWaitTime = 3*60000;//let's wait for a maximum of 3 minute
do
{
    destBlob.FetchAttributes();
    if (destBlob.CopyState.BytesCopied > 2048 || maxWaitTime <= 0)
    {
        break;
    }
    maxWaitTime -= 1000;
    Thread.Sleep(1000);
 }
 while (true);

 var data = new byte[512];
 using (BlobStream blobStream = destBlob.OpenRead())
 {
     blobStream.Seek(0, System.IO.SeekOrigin.Begin);
     blobStream.Read(data, 0, 512);
 }
4

2 に答える 2

2

ご存知かもしれませんが、BLOB のコピー操作は非同期です。を呼び出すStartCopyFromBlobと、操作はキューに入れられます。動作がすぐに開始されることを保証するものではありません。これが、コピー操作の開始直後に意味のあるデータを読み取ることができない理由である可能性があります。

できることの 1 つは、コピー操作を呼び出した後、定期的にコピー ステータスを確認することです。コピー操作が開始されたことを確認したら、宛先 BLOB からの読み取りを開始できます。

コピー操作が開始されたかどうかを確認するには、ループで BLOB 属性をフェッチしCopyState、BLOB のプロパティを確認します。いくつかのバイトがコピーされていることを確認したら、ループから抜け出すことができます。ただし、コピー操作が適切な時間枠内に開始されない場合、このループで長時間ループすることになる可能性があることに注意してください。

だから代わりに:

Thread.Sleep(4000)

次のようなことができます。

int maxWaitTime = 10000;//let's wait for a maximum of 10 seconds
do
{
    destBlob.FetchAttributes();
    if (destBlob.CopyState.BytesCopied > 0 || maxWaitTime <= 0)
    {
        break;
    }
    maxWaitTime -= 1000;
    Thread.Sleep(1000);
}
while (true);
于 2013-10-10T05:12:33.513 に答える