为什么不使用CloudTableQuery.Begin / EndExecuteSegmented auto-hande continuation tokens

时间:2013-08-07 18:11:18

标签: azure azure-storage azure-table-storage

我正在使用.NET存储客户端(2012年6月),我有一个类似以下的查询

(from e in tableContext.CreateQuery<Entity>(tableName)
 select e).AsTableServiceQuery();

返回CloudTableQuery类型,documented为:

  

“将类型DataServiceQuery的查询转换为处理延续令牌的CloudTableQuery对象,并重试对Table服务的失败调用。”

我试图让CloudTableQuery在我的表服务响应中“内部”处理分页。 Execute()方法正是如此,如果有更多结果,则处理延续令牌。

另一方面,当我尝试使用异步方法进行相同的操作(BeginExecuteSegmented / EndExecuteSegmented对)时,我发现BeginExecuteSegmented的两个重载都不能在内部处理分页(正如AsTableServiceQuery()文档中所宣传的那样)。

因此编写了以下代码段:

while (true){
    var ar = continuationToken == null ?
        entities.BeginExecuteSegmented(null, null)
        : entities.BeginExecuteSegmented(continuationToken, null, null);

    var task = Task.Factory.FromAsync(ar, r => entities.EndExecuteSegmented(r));
    var resultSegment = await task;
    results.AddRange(resultSegment.Results);
    if (resultSegment.HasMoreResults)
    {
        continuationToken = resultSegment.ContinuationToken;
    }
    else { break; }
}

这会成功处理分页,但我想了解为什么Begin/EndExecuteSegmented CloudTableQuery Execute()内部处理分页,就像同步等效{{1}}那样。

感谢。

1 个答案:

答案 0 :(得分:1)

ExecuteSegmented仅返回单个结果段,其中包含实体和延续令牌。另一方面,Execute在内部处理continuation,并将遍历所有结果段。

但您是对的,Windows Azure存储客户端库中没有BeginExecute和EndExecute。原因很简单就是IEnumerable的定义。 IEnumerable本身不是异步的,因此,当需要获取下一个不同步的结果段时,实现必须阻塞调用者。