2012-07-10 80 views
0

我有一個基於事件的異步操作(EAP)的類。我可以根據它創建一個任務here是否使用從EAP創建的任務的額外線程?

當我使用EAP:

我的話題 - >調用方法 - >它創建線程 - >在其中做一些事情。

當我創建的任務,我懷疑:

我的話題 - >創建任務 - >它創建線程 - >它調用方法 - >它創建線程 - >在其中做一些事情。

這是真的嗎?

編輯:

Offcourse任務將不會創建一個線程 - 如果需要,將採取線程的線程池。但是否會被採用,我將不得不花費線程池中的寶貴額外線程?

回答

1

要準確地知道會發生什麼,我需要查看您的具體代碼,包括如何使用生成的Task

但是通常情況下,如果使用TaskCompletionSource將EAP換成Task,它將不會佔用池中的另一個線程,因爲沒有要執行的代碼。

如果您的意思是如果您在Task上使用ContinueWith()會發生什麼情況,那取決於您是否設置了TaskContinuationOptions.ExecuteSynchronously。如果你沒有設置它,則繼續將在從池中取出的「新」線程上運行。如果你設置了它,它將運行在設置Task的結果的同一個線程上。 (您應該只使用ExecuteSynchronously進行非常短的延續。)

但是延續會從池中取出新線程,還是使用由其他人從池中取出的線程無關緊要。重要的是在操作完成之前是否有線程阻塞。在這兩種情況下,這都不會發生。

0

它不會創建兩個新線程。事實上,它甚至不確定它會創建一個新的線程。它可能只是從ThreadPool中選擇一個已經存在的一個。

+0

那麼,它會從池中的額外線程? – 2012-07-10 12:46:16

相關問題