1

我曾经启动复制 blob,在复制过程中,我们能够读取目标 blob 的几个字节(例如前 512 个字节)。请参阅下面的代码,该代码启动复制 blob,然后在复制过程中读取前 512 个字节。

但是现在 blobStream.Read 总是用零而不是实际字节填充数据缓冲区。我也尝试过使用最新的天蓝色存储客户端库,但输出是相同的。但是一旦复制完成,我就可以读取实际字节。

有人请让我知道这是否是最新的 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时,操作将排队。无法保证操作会立即开始。这可能是开始复制操作后无法立即读取有意义的数据的原因。

您可以做的一件可能的事情是在调用复制操作后定期检查复制状态。一旦您看到复制操作已经开始,您就可以开始从目标 blob 中读取。

要检查复制操作是否已开始,您可以在循环中获取 blob 属性并检查 blob 的属性CopyState。一旦你看到一些字节被复制,你就可以跳出循环。但是请记住,如果复制操作没有在合理的时间范围内开始,您最终可能会在此循环中循环很长时间。

所以不要这样做:

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 回答
0

看起来用户必须等待复制完成才能从目标 blob 中读取实际字节。

CopyState::BytesCopied 可用于跟踪复制的字节数,用户不应根据 CopyState::BytesCopied 假定目标 blob 已准备好读取。在 CopyState::Status 变为“成功”后只读。

于 2013-10-14T22:23:38.843 回答