Асинхронная загрузка BLOB-объекта Azure в строку с помощью .NET 4.5 async, ожидайте
Я пытаюсь реализоватьполностью асинхронный загрузка BLOB-объектов с помощью .NET 4.5 async & await.
Давайте предположим, что весь блоб может поместиться в памяти одновременно, и мы хотим сохранить его вstring
.
Код:
public async Task<string> DownloadTextAsync(ICloudBlob blob)
{
using (Stream memoryStream = new MemoryStream())
{
IAsyncResult asyncResult = blob.BeginDownloadToStream(memoryStream, null, null);
await Task.Factory.FromAsync(asyncResult, (r) => { blob.EndDownloadToStream(r); });
memoryStream.Position = 0;
using (StreamReader streamReader = new StreamReader(memoryStream))
{
// is this good enough?
return streamReader.ReadToEnd();
// or do we need this?
return await streamReader.ReadToEndAsync();
}
}
}
Использование:
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageAccountConnectionString"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("container1");
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob1.txt");
string text = await DownloadTextAsync(blockBlob);
Является ли этот код правильным и действительно ли он полностью асинхронный? Вы бы реализовали это по-другому?
Буду признателен за некоторые дополнительные разъяснения:
GetContainerReference
а такжеGetBlockBlobReference
не нужно быть асинхронным, так как они еще не связываются с сервером, верно?
Есть лиstreamReader.ReadToEnd
нужно быть асинхронным или нет?
Я немного смущен тем, чтоBeginDownloadToStream
делает .. к тому времениEndDownloadToStream
называется, мой поток памяти имеетвсе данные внутри? или поток только открытый предварительно прочитан?
Обновление: (начиная с Storage 2.1.0.0 RC)
Async теперь поддерживается изначально.
CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageAccountConnectionString"));
CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
CloudBlobContainer container = blobClient.GetContainerReference("container1");
CloudBlockBlob blockBlob = container.GetBlockBlobReference("blob1.txt");
string text = await blockBlob.DownloadTextAsync();