-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)不會成爲假,直到所有的異步操作已完成...

+0

最後的回報讓我輕笑。好樣的!非常有創意的方式來實現異步返回(異常處理會很好,但否則,真的 - 不壞)。有一件事對我來說看起來很糟糕,它是在* tight *循環中的'outQ.ExecuteNextAsync'。您不能依賴異步調用來及時爲下一次循環迭代正確設置您的'outQ.HasMoreResults',因此您可能最終排隊執行比您真正需要的更多任務。 –

+0

@KirillShlenskiy這是我的演示代碼,我省略了它,但真正的交易肯定會有異常處理和重試邏輯 – Leonardo

+0

我希望「真正的交易」也將使用TPL數據流或至少一些其他良好建立的異步生產者 - 消費者模式(例如來自Microsoft的並行編程模式的經典管道,第55頁:https://www.microsoft.com/en-au/download/details.aspx?id=19222) –

回答

0

您對HasMoreResults不夠快速更新的關注是有根有據的。您不能調度異步操作,並假定該對象將立即過渡到異步操作的處的預期狀態。在這種特殊情況下,您別無選擇,只能以等待爲異步操作來完成。

我假定圖書館作者故意選擇了不適合並行化的API--很可能是因爲它封裝了需要連續完成的工作類型。