在C#多線程之線程池篇中,我們將學(xué)習(xí)多線程訪問共享資源的一些通用的技術(shù),我們將學(xué)習(xí)到以下知識點:

  • 在線程池中調(diào)用委托

  • 在線程池中執(zhí)行異步操作

  • 線程池和并行度

  • 實現(xiàn)取消選項

  • 使用等待句柄和超時

  • 使用計時器

  • 使用后臺工作組件

  在前面的“C#多線程之基礎(chǔ)篇”以及“C#多線程之線程同步篇”中,我們學(xué)習(xí)了如何創(chuàng)建線程以及如何使用多線程協(xié)同工作,在這一篇中,我們將學(xué)習(xí)另外一種場景,就是我們需要創(chuàng)建許多花費時間非常短的異步操作來完成某些工作。我們知道創(chuàng)建一個線程是非常昂貴的,因此,對于每個花費時間非常短的異步操作都創(chuàng)建一個線程是不合適的。

  我們可以使用線程池來解決以上問題,我們可以在線程池中分配一定數(shù)量的線程,每當(dāng)我們需要一個線程時,我們只需要在線程池中取得一個線程即可,而不需要創(chuàng)建一個新的線程,當(dāng)我們使用完一個線程時,我們僅僅需要把線程重新放入線程池中即可。

  我們可以使用System.Threading.ThreadPool類型來利用線程池。線程池由Common Language Runtime(CLR)進行管理,這意味著每一個CLR只能有一個線程池實例。ThreadPool類型有一個“QueueUserWorkItem”靜態(tài)方法,這個靜態(tài)方法接收一個委托,該委托代表一個用戶自定義的異步操作。當(dāng)這個方法被調(diào)用時,這個委托就進入內(nèi)部隊列,這個時候,如果線程池中沒有線程,則會創(chuàng)建一個新的工作線程,然后將這個委托(第一個)放入隊列中。

  如果先前的操作執(zhí)行完畢后,我們又放置了一個新的操作到線程池,那么我們可能會重用上一次操作的那個工作線程。如果我們放置新的操作的時候,線程池中的線程數(shù)已達到上限,那么新的操作會在隊列中等待,直到線程池中有可用工作線程為止。

  需要注意的是,我們盡量在線程池中放置一些需要花費較少時間既能完成的操作,而不要放置需要花費大量時間才能完成的操作,同時不要阻塞工作線程。如果不是這樣,工作線程會變得非常繁忙,以至于不能響應(yīng)用戶操作,同時也會導(dǎo)致性能問題以及難以調(diào)試的錯誤。

  另外,線程池中的工作線程都是

網(wǎng)友評論