gpt4 book ai didi

c# - 如何将 Table.ExecuteQuerySegmentedAsync() 与 Azure 表存储结合使用

转载 作者:太空狗 更新时间:2023-10-29 18:31:52 25 4
gpt4 key购买 nike

使用 Azure 存储客户端库 2.1,我正在努力对表存储进行异步查询。我创建了这段代码:

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;
}

假设有大量数据返回,因此将会有大量的表存储往返。我遇到的问题是,我们正在等待一组数据,将其添加到内存列表中,等待更多数据,将其添加到同一个列表中,等待更多数据,将其添加到列表中......等等等等。为什么不直接将 Task.Factory.StartNew() 包装在常规 TableQuery 周围呢?就像这样:

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;
}

这样做看起来我们并没有太多地来回反弹 SynchronizationContext。或者说这真的很重要吗?

编辑以改写问题

上面提到的两种场景有什么区别?

最佳答案

两者之间的区别在于,您的第二个版本将在查询执行的整个过程中阻塞ThreadPool线程。这在 GUI 应用程序中可能是可以接受的(您想要的只是在 UI 线程以外的其他地方执行代码),但它会抵消服务器应用程序中异步的任何可扩展性优势。

此外,如果您不希望第一个版本每次往返都返回到 UI 上下文(这是一个合理的要求),那么每当您使用 时,请使用 ConfigureAwait(false)等待:

querySegment = await theQuery.AsTableQuery()
.ExecuteSegmentedAsync(…)
.ConfigureAwait(false);

这样,第一次迭代之后的所有迭代(很可能)都会在 ThreadPool 线程上执行,而不是在 UI 上下文上执行。

顺便说一句,在你的第二个版本中,你实际上根本不需要await,你可以直接返回Task:

public Task<List<TAzureTableEntity>> GetByPartitionKey(string partitionKey)
{
return Task.Run(() => table.CreateQuery<TAzureTableEntity>()
.Where(ent => ent.PartitionKey == partitionKey)
.ToList());
}

关于c# - 如何将 Table.ExecuteQuerySegmentedAsync() 与 Azure 表存储结合使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19625038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com