Типы BLOB-объектов хранилища Azure (CloudBlobContainer, CloudBlobClient и т. Д.) И безопасность потоков - PullRequest
7 голосов
/ 02 августа 2011

Я занимаюсь разработкой приложения Azure, которому необходимо в какой-то момент загрузить (загрузить) большое количество небольших больших двоичных объектов в один контейнер (более 1 тыс. Больших двоичных объектов, менее 1 МБ каждый).Чтобы ускорить этот процесс, я хотел бы использовать несколько потоков для загрузки (скачивания) блобов.

Это процедура, которую я использую для загрузки одного большого двоичного объекта:

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 в разных потоках, в противном случае это серьезно замедляет загрузку (загрузка) процесс.

1 Ответ

8 голосов
/ 02 августа 2011

У вас должно получиться совместное использование одной ссылки на контейнер большого двоичного объекта, если вы не пытаетесь выполнить обновление самого контейнера (даже тогда, я думаю, что это будет нормально в большинстве сценариев, таких как List). На самом деле, вам даже не нужна ссылка на контейнер, если вы уверены, что он существует:

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

Как видите, единственная причина для получения ссылки на контейнер - это если вы хотите выполнить операцию над самим контейнером (список, удаление и т. Д.). Если вы будете хранить ссылки на BLOB-объекты в отдельных потоках, все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...