2011-08-02 55 views
4

我正在開發一個azure應用程序,它需要在某個時間點將大量小塊上傳(下載)到一個容器(超過1k塊,每個小於1 Mb)。爲了加快這個過程,我想使用多線程來上傳(下載)blob。Azure存儲Blob類型(CloudBlobContainer,CloudBlobClient等)和線程安全

這是常規我使用上傳單個斑點:

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)的成員這種類型是 線程安全。任何實例成員不保證是線程 安全。

這是否意味着我需要在每個線程中執行以下代碼?或者,也許我只能執行一次並在不同線程之間共享單個CloudBlobContainer實例?

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

我會真的很高興在不同的線程使用CloudBlobContainer的單個實例,否則嚴重減慢整個上傳(下載)的過程。

回答

6

只要您沒有嘗試對容器本身執行更新(即使那樣,我認爲它在大多數場景中仍然沒問題,例如List),您應該很好地共享一個blob容器參考。其實,你並不真正需要,甚至在容器的參考,如果你確信它的存在:

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

正如你看到的,讓容器參考的唯一原因是,如果要執行的操作容器本身(列表,刪除等)。如果你將blob引用放在不同的線程中,你會沒事的。

+0

感謝您的回覆。我想知道是否也可以在線程之間共享CloudBlobClient和CloudStorageAccount引用? – monofilm

+0

一般來說,這應該沒問題,因爲CloudStorageAccount只不過是數據而已,我不認爲它是可變的(一旦設置就無法更改憑證)。我相信客戶是類似的。但是,如果您在不同的線程上改變設置(如DefaultDelimiter,Retry等),可能會發生奇怪的事情。最好共享CloudStorageAccount並在每個線程中啓動一個新客戶端以確保安全。無論如何,這是輕量級的。 – dunnry

+0

你能查看這個http://stackoverflow.com/questions/24229288/parallel-blob-upload-throwing-404-bad-request-intermittently – user960567