2011-12-22 41 views
0

我期待到使用新的異步/ 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。也許某種組合等待和任務的方式可能是可能的。

回答

1

該示例的要點是顯示一個「管道」模式,其中最多隻有一個提取和一個存檔同時執行。

async並不意味着併發,它意味着非阻塞。

+0

感謝您的回覆,但我只是使用snippit作爲在循環中使用await的示例。我試圖找到它將使用多少線程的底部。如果await在這樣的循環中,那麼循環僅在await返回後繼續。 從那篇文章: 「如果我們正在等待的任務尚未完成,則將該方法的其餘部分註冊爲該任務的繼續,然後立即返回給調用者; 「 這似乎表明,只有一個線程將用於FetchAsync – 2011-12-22 12:09:50

+0

當您執行'await'表達式時,'async'方法的其餘部分,包括任何類似狀態循環索引,存儲在狀態機對象中。然後'async'方法返回控制給它的調用者 - 它退出。所以不,循環不會繼續執行。當等待的方法完成時,控制權返回到狀態機,然後狀態機繼續執行。 – 2011-12-22 12:18:50

+0

這裏有一些*併發性,如果你以另一種方式來看待它。當'async'方法由於'await'返回給它的調用者時,'async'方法本身不會繼續運行,但'Fetch'和/或'Archive'操作*做*。我將'async' /'await'視爲一種以編程友好的方式管理併發的方式。 – 2011-12-22 17:31:10

0

asyncawait關鍵字本身不會創建任何線程。這完全取決於處理任務本身的方法。實際上,文件系統I/O或網絡連接等操作通常不需要任何線程異步運行。硬件完成硬件的功能,完成後會觸發相關事件(回到C#中)。

如果要控制線程數,則需要更改創建線程的方法 - 而且它與asyncawaits無關。