Làm việc với thư viện Azure Storage Client 2.1, tôi đang làm việc để tạo truy vấn không đồng bộ lưu trữ bảng. Tôi đã tạo mã này:Cách sử dụng Table.ExecuteQuerySegmentedAsync() với bộ lưu trữ bảng Azure
public async Task<List<TAzureTableEntity>> GetByPartitionKey(string partitionKey)
{
var theQuery = _table.CreateQuery<TAzureTableEntity>()
.Where(tEnt => tEnt.PartitionKey == partitionKey);
TableQuerySegment<TAzureTableEntity> querySegment = null;
var returnList = new List<TAzureTableEntity>();
while(querySegment == null || querySegment.ContinuationToken != null)
{
querySegment = await theQuery.AsTableQuery()
.ExecuteSegmentedAsync(querySegment != null ?
querySegment.ContinuationToken : null);
returnList.AddRange(querySegment);
}
return returnList;
}
Giả sử có một lượng lớn dữ liệu quay lại để có rất nhiều chuyến đi khứ hồi tới Bộ nhớ bảng. Vấn đề tôi gặp phải là chúng tôi đang chờ một bộ dữ liệu, thêm nó vào danh sách trong bộ nhớ, đang chờ thêm dữ liệu, thêm nó vào cùng một danh sách, đang chờ thêm dữ liệu, thêm dữ liệu vào danh sách ... trên và vân vân. Tại sao không chỉ quấn một Task.Factory.StartNew() xung quanh một TableQuery thông thường? Giống như vậy:
public async Task<List<TAzureTableEntity>> GetByPartitionKey(string partitionKey)
{
var returnList = await Task.Factory.StartNew(() =>
table.CreateQuery<TAzureTableEntity>()
.Where(ent => ent.PartitionKey == partitionKey)
.ToList());
return returnList;
}
Làm theo cách này có vẻ như chúng tôi không bật lại SynchronizationContext quá nhiều. Hay nó thực sự quan trọng?
Edit để rephrase câu hỏi
sự khác biệt giữa hai tình huống nêu trên là gì?
Bạn đặt "phân khúc" của mình trong phương pháp async riêng của nó và gọi nó bằng cách sử ConfigureAwait (sai). –
@PauloMorgado - Trớ trêu thay tôi thực sự có TableQuerySegement và trong khi câu lệnh trong một phương thức riêng biệt đã có nhưng tôi không biết về phương thức ConfigureAwait (false) trên Task. Cảm ơn vì tiền hỗ trợ! – Hallmanac
ConfigureAwait (false) được khuyến nghị cho tất cả mã thư viện và tôi sẽ mở rộng nó cho tất cả mã ứng dụng không phải UI. –