0

我正在使用 .NET 存储客户端(2012 年 6 月),我有如下查询

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

这将返回CloudTableQuery类型,并记录为:

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

我试图让 CloudTableQuery 为我在表服务响应中“内部”处理分页。Execute()方法正是这样做的,如果有更多结果,则处理继续标记。

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

因此编写了以下代码段:

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分页。CloudTableQueryExecute()

谢谢。

4

1 回答 1

1

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

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

于 2013-08-07T22:48:53.423 回答