我期待到使用新的異步/ C#中5等待圖片關鍵詞和閱讀this article使用時控制線程數量C#5異步/伺機
我看到下面的例子
async void ArchiveDocuments(List<Url> urls)
{
Task archive = null;
for(int i = 0; i < urls.Count; ++i)
{
var document = await FetchAsync(urls[i]);
if (archive != null)
await archive;
archive = ArchiveAsync(document);
}
}
據推測,如果網址列表非常長,我們可能會陷入線程崩潰失控的情況。
我想知道的是推薦的方法來控制使用的線程數。有沒有辦法指定一個線程池或最大數量?
使用TPL,您可以使用選項來控制最大線程數 ParallelOptions.MaxDegreeOfParallelism。也許某種組合等待和任務的方式可能是可能的。
感謝您的回覆,但我只是使用snippit作爲在循環中使用await的示例。我試圖找到它將使用多少線程的底部。如果await在這樣的循環中,那麼循環僅在await返回後繼續。 從那篇文章: 「如果我們正在等待的任務尚未完成,則將該方法的其餘部分註冊爲該任務的繼續,然後立即返回給調用者; 「 這似乎表明,只有一個線程將用於FetchAsync – 2011-12-22 12:09:50
當您執行'await'表達式時,'async'方法的其餘部分,包括任何類似狀態循環索引,存儲在狀態機對象中。然後'async'方法返回控制給它的調用者 - 它退出。所以不,循環不會繼續執行。當等待的方法完成時,控制權返回到狀態機,然後狀態機繼續執行。 – 2011-12-22 12:18:50
這裏有一些*併發性,如果你以另一種方式來看待它。當'async'方法由於'await'返回給它的調用者時,'async'方法本身不會繼續運行,但'Fetch'和/或'Archive'操作*做*。我將'async' /'await'視爲一種以編程友好的方式管理併發的方式。 – 2011-12-22 17:31:10