Azure存储Blob类型(CloudBlobContainer,CloudBlobClient等)和线程安全

时间:2011-08-02 16:35:14

标签: azure thread-safety blob azure-storage azure-storage-blobs

我正在开发一个天蓝色的应用程序,它需要在某个时刻上传(下载)大量的小blob到一个容器(超过1k blob,每个小于1 Mb)。为了加快这个过程,我想使用多个线程来上传(下载)blob。

这是我用来上传单个blob的例程:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = 
    blobClient.GetContainerReference(ContainerName);
blobContainer.CreateIfNotExist();

CloudBlob blob = blobContainer.GetBlobReference(Id);
blob.UploadByteArray(Data);

对于上面代码中使用的每种类型,MSDN说:

  

此类型的任何公共静态(在Visual Basic中为Shared)成员都是   线程安全。任何实例成员都不能保证是线程   安全

这是否意味着我需要在每个线程中执行以下代码?或者也许我只能执行一次并在不同的线程之间共享CloudBlobContainer的单个实例?

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(ConnectionString);
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer blobContainer = 
    blobClient.GetContainerReference(ContainerName);

我很乐意在不同的线程中使用单个CloudBlobContainer实例,否则会严重影响整个上传(下载)过程。

1 个答案:

答案 0 :(得分:8)

只要您不尝试对容器本身执行更新,您就可以共享单个blob容器引用(即便如此,我认为在大多数情况下它仍然可以正常使用List)。事实上,如果您确定它存在,您甚至不需要容器引用:

client.GetContainerReference("foo").GetBlobReference("bar");
client.GetBlobReference("foo/bar");  //same

如您所见,获取容器引用的唯一原因是您是否要对容器本身执行操作(列表,删除等)。如果你将blob引用保存在不同的线程中,你会没事的。