簡體   English   中英

我什么時候調用BeginXXX()時CLR創建IO線程

[英]When does the CLR create the IO thread when I call BeginXXX()

假設我調用了HttpWebRequest.BeginGetRequestStream()方法。

我知道這個方法是異步的,當它完成時,應該調用一個回調方法。

我非常確定的是,當調用回調方法時,CLR會創建一個I / O線程,這個I / O線程會進行回調。

我不確定的是當我調用HttpWebRequest.BeginGetRequestStream()時,是否有CLR創建的I / O線程? 或者只是創建一個工作線程來將請求發送到設備?

Async IO是無線程的。 沒有創建或阻止線程。 這是使用異步IO的全部意義! 什么會幫助您解鎖一個線程並阻止另一個線程?

已經多次討論了這種內部結構。 基本上,操作系統在IO完成時通知CLR。 這會導致CLR將您指定的完成回調排隊到線程池中。

簡短的回答:你不在乎。

答案很長:

沒有線程。 更確切地說,您創建的每個異步請求都沒有線程。 相反,線程池上有一堆I / O線程,它們主要在IOCP上“等待” - 等待內核在數據可用時將其喚醒。

重要的一點是,每一個都可以響應任何通知,它們(必然)沒有選擇性。 如果你需要處理1000個響應,你仍然可以只使用一個線程 - 而且只是在此時才請求來自線程池的線程; 它必須執行回調方法。 例如,使用同步方法,您必須保留一千個線程來處理一千個TCP連接。

使用異步方法,您只需要一個IOCP線程,並且您只需要生成(或者更確切地說,借用)新線程來執行回調 - 這些回調僅在您獲得新數據/連接之后執行,並且返回一旦你完成,就到線程池。 實際上,這意味着TCP服務器只需少量線程即可處理數千個並發TCP連接。 畢竟,產生更多的線程比你的CPU可以處理的更少(這些天通常是你擁有內核的兩倍),以及所有不需要CPU的東西(如異步I / O) 不要求你產生新的線程 如果少數處理線程不夠,那么與同步I / O場景不同,添加更多線程將無濟於事。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM