AsDocumentQuery.HasMore结果并行性?

时间:2017-07-26 12:58:51

标签: asynchronous async-await task-parallel-library azure-cosmosdb

我还没有遇到过对文档的查询超过1“set”的情况。我想知道,如果不是

会发生什么
while (queryable.HasMoreResults) 
{
    foreach(Book b in await queryable.ExecuteNextAsync<Book>())
    {
        // Iterate through books
    }
}

我用

ConcurrentBag<IPost> result = new ConcurrentBag<IPost>();
List<Task> tasks = new List<Task>();
var outQ = query.AsDocumentQuery<IPost>();
while (outQ.HasMoreResults)
{
    var parcialResult = outQ.ExecuteNextAsync<IPost>().ContinueWith((t) =>
    {
        foreach (var item in t.Result)
        {
            result.Add(item);
        }
    });
    tasks.Add(parcialResult);
}

return Task.WhenAll(tasks).ContinueWith((r) => { return result.AsEnumerable(); });

我的印象是,一旦部分查询同时执行,第二种方法,即并行方法会产生更多性能......但我担心while (outQ.HasMoreResults)不会变错直到所有异步操作都完成...

1 个答案:

答案 0 :(得分:0)

您对HasMoreResults没有足够快速更新的担忧是有根据的。您无法调度异步操作并假设该对象将立即转换到异步操作的 end 所期望的状态。在这种特殊情况下,您别无选择,只能等待以完成异步操作。

我认为图书馆作者故意选择了不适合并行化的API - 很可能是因为它封装了需要连续完成的工作。