我正在開發一個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的單個實例,否則嚴重減慢整個上傳(下載)的過程。
感謝您的回覆。我想知道是否也可以在線程之間共享CloudBlobClient和CloudStorageAccount引用? – monofilm
一般來說,這應該沒問題,因爲CloudStorageAccount只不過是數據而已,我不認爲它是可變的(一旦設置就無法更改憑證)。我相信客戶是類似的。但是,如果您在不同的線程上改變設置(如DefaultDelimiter,Retry等),可能會發生奇怪的事情。最好共享CloudStorageAccount並在每個線程中啓動一個新客戶端以確保安全。無論如何,這是輕量級的。 – dunnry
你能查看這個http://stackoverflow.com/questions/24229288/parallel-blob-upload-throwing-404-bad-request-intermittently – user960567