我正在开发一个天蓝色的应用程序,它需要在某个时刻上传(下载)大量的小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实例,否则会严重影响整个上传(下载)过程。
答案 0 :(得分:8)
只要您不尝试对容器本身执行更新,您就可以共享单个blob容器引用(即便如此,我认为在大多数情况下它仍然可以正常使用List)。事实上,如果您确定它存在,您甚至不需要容器引用:
client.GetContainerReference("foo").GetBlobReference("bar");
client.GetBlobReference("foo/bar"); //same
如您所见,获取容器引用的唯一原因是您是否要对容器本身执行操作(列表,删除等)。如果你将blob引用保存在不同的线程中,你会没事的。