Асинхронная загрузка 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();

Ответы на вопрос(3)

Ваш ответ на вопрос