1

一个初学者的问题,但我在其他任何地方都找不到明确的答案。

如果我使用 blob.uploadtext() 从两个不同的线程同时更新同一个 blob,会发生什么?后者会失败吗?还是后者只是覆盖?

另外,如果我在uploadtext() 正在进行时从blob 读取会发生什么?读取会返回以前的版本吗?还是读取失败?如果读取失败,我应该重试吗?

在我的场景中,我有多个工作角色实例,它们可能会不时更新同一个 blob(大小为 10 MB)。我并不真正关心谁赢得了写入,只要他们不破坏 blob 并且读取 blob 不会被阻塞很长时间。

更新:我编写了一个示例程序,将一个 5MB 的文件从 3 个不同的线程上传到同一个 blobreference。我发现是这样的: 1.如果线程重用blobReference对象,那么第二个和第三个线程会得到MD5不匹配异常。但是第一个线程仍然可以成功完成上传。2.如果每个线程创建自己的 BlobClient/BlobReference 对象,那么所有的上传都会成功,实际的 blob 内容与最后完成的内容匹配。

但是,在将 blob 上传的大小增加到 10MB 文件后,我收到了 StorageClientException:指定的阻止列表无效。更糟糕的是,在此异常之后,blob 内容不知何故为 0 字节。所以我的 blob 上传失败并清除了 blob 内容。这似乎是一个相当严重的问题。有任何想法吗?

下面是示例代码:

        Task[] tasks = new Task[6];

        tasks[0] = Task.Factory.StartNew(() => DoUpload(BlobClient, testStreams, 0));
        tasks[1] = Task.Factory.StartNew(() => ReadBlob(BlobClient,0));
        tasks[2] = Task.Factory.StartNew(() => DoUpload(BlobClient, testStreams, 1));
        tasks[3] = Task.Factory.StartNew(() => ReadBlob(BlobClient, 1));
        tasks[4] = Task.Factory.StartNew(() => DoUpload(BlobClient, testStreams, 2));
        tasks[5] = Task.Factory.StartNew(() => ReadBlob(BlobClient, 2));

        Task.WaitAll(tasks);

DoUpload 使用以下方式上传:

        blob.UploadFromStream(streams[i]);

谢谢。

4

0 回答 0