Tôi đang cố gắng triển khai hoàn toàn không đồng bộ tải xuống blob với .NET 4.5 async & đang chờ.Tải xuống không đồng bộ một đốm màu Azure thành chuỗi có .NET 4.5 async, đang chờ
Giả sử toàn bộ đốm màu có thể vừa với bộ nhớ cùng một lúc và chúng tôi muốn giữ nó trong một số string
.
Code:
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();
}
}
}
Cách sử dụng:
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);
là mã này đúng và điều này thực sự là hoàn toàn không đồng bộ? Bạn sẽ thực hiện điều này một cách khác nhau?
Tôi đánh giá cao một số giải thích thêm:
GetContainerReference
vàGetBlockBlobReference
không cần phải async vì họ không liên lạc với máy chủ nào, phải không?Có
streamReader.ReadToEnd
cần phải không đồng bộ hay không?Tôi là một chút nhầm lẫn về những gì
BeginDownloadToStream
không .. vào thời điểmEndDownloadToStream
được gọi, không dòng ký ức của tôi có tất cả dữ liệu bên trong? hoặc là luồng chỉ mở trước đọc?
Cập nhật: (tính lưu trữ 2.1.0.0 RC)
Async hiện được hỗ trợ natively.
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();
Các tài liệu không phải là quá dài dòng về vấn đề này .. Tôi đoán thử nghiệm là theo thứ tự, tôi sẽ mất một blob lớn và làm một số thời gian. Điều này là rất khó khăn và tôi mong đợi nó được rõ ràng :) – talkol
Các tài liệu rõ ràng trên BeginDownloadToStream - gọi lại (trong trường hợp của bạn, mã gọi EndDownloadToStream) được gọi khi "hoạt động hoàn thành". –
@PeterRitchie Tôi không chắc chắn 100% hoạt động chính xác là gì. Nó là toàn bộ tải xuống hay chỉ là khởi đầu (truy vấn đầu tiên của máy chủ). Nếu đó là trước đây, tôi có cách nào khác để nhận thông báo về tiến độ hoặc hủy nếu quá dài/lớn không? – talkol