-2
我還沒有面對一個文檔查詢有多個「設置」的情況。我在想,會發生什麼,如果不是AsDocumentQuery.HasMore結果並行性?
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)
不會成爲假,直到所有的異步操作已完成...
最後的回報讓我輕笑。好樣的!非常有創意的方式來實現異步返回(異常處理會很好,但否則,真的 - 不壞)。有一件事對我來說看起來很糟糕,它是在* tight *循環中的'outQ.ExecuteNextAsync'。您不能依賴異步調用來及時爲下一次循環迭代正確設置您的'outQ.HasMoreResults',因此您可能最終排隊執行比您真正需要的更多任務。 –
@KirillShlenskiy這是我的演示代碼,我省略了它,但真正的交易肯定會有異常處理和重試邏輯 – Leonardo
我希望「真正的交易」也將使用TPL數據流或至少一些其他良好建立的異步生產者 - 消費者模式(例如來自Microsoft的並行編程模式的經典管道,第55頁:https://www.microsoft.com/en-au/download/details.aspx?id=19222) –