一个初学者问题,但我无法在其他任何地方找到明确答案。
如果我使用blob.uploadtext()从两个不同的线程同时更新同一个blob会发生什么?后者会失败吗?或后者只是覆盖?
此外,如果我在uploadtext()正在进行时从blob中读取会发生什么?读取是否会返回先前的版本?或者读取失败?如果读取失败,我应该重试吗?
在我的场景中,我有多个worker角色实例,可能会不时更新相同的blob(大小为10 MB)。我不关心谁赢得写,只要他们不破坏blob并且读取blob很长时间没有被阻止。
更新:我写了一个示例程序,将3MB文件从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]);
感谢。