2012-08-03 25 views
3

如果您決定通過將UI線程中的一些CPU密集代碼放入任務並將其運行到線程池中來卸載這些代碼,該代碼本身是否會從使用「等待」關鍵字?您是否曾經在線程池線程上使用await關鍵字

它有點好像答案是「不」 ..

我的意思是,主要的原因等待任務UI線程中的一個是釋放UI線程備份做在做什麼之前。如果您在線程池上運行時等待任務,那麼您可以釋放該線程來完成什麼任務?

我是否錯過了一些非常明顯的東西?

回答

3

如果您決定通過將UI線程中的一些CPU密集代碼放入任務並在線程池中運行來減輕這些代碼的負擔,這種代碼本身是否會從使用「await」關鍵字獲益?

只是對於CPU密集型任務?也許不會。

但這不是在線程池線程中運行代碼的唯一原因。

考慮一個web服務器 - 所有請求都將在線程池線程中處理......並在處理這些請求時使用await(例如在等待數據庫或其他Web服務響應時),您可以處理數百萬個請求非常少的線程。

此外,即使在豐富的GUI方案中,您可能也想將一些長時間運行的任務放到線程池線程中,但仍然從該線程啓動多個異步請求。異步/等待的方式鼓勵異步操作的組合使得以異步的方式編寫代碼是完全合理的,無論它運行在哪個線程上。

+0

關於:「..並通過在處理這些請求時使用await(例如在等待數據庫或其他Web服務響應時),您可以在極少數線程上處理數百萬個請求」..假設您有線程池線程# 12處理Web請求,並在異步數據庫讀取中等待。這是否意味着,當它「等待」時,該線程#12被放回池中,並可用於做其他工作? – 2012-08-13 15:57:59

+0

@MichaelRayLovett:是的,確切地說。 – 2012-08-13 15:59:50

+0

OMG這是我完全不瞭解所有關於TAP的討論等等。因此,當等待完成的任務完成時,完成代碼甚至可能無法在發出await的原始線程上運行,是嗎? – 2012-08-13 16:06:01