2016-08-23 37 views
1

當將多個完成的任務傳遞給Task.WhenAny時,Task.WhenAny會優先選擇完成哪個任務任務將被返回?是否Task.WhenAny優先考慮某些任務而非其他任務?

+0

你爲什麼要把完成的任務發送到'Task.WhenAny'? – Jonesopolis

+0

否。如果您要添加完成的任務,則會返回它在集合中遇到的第一個完成的任務(按自然順序迭代,沒有任何瘋狂)。我非常懷疑順序是在任何地方指定的,所以行爲*可能會改變,但不可能。如果沒有任務完成,那麼它將返回*運行完成的第一個任務。 [相關源代碼](http://referencesource.microsoft.com#mscorlib/system/threading/Tasks/TaskFactory.cs,db51a91904616672) –

回答

1

當你想知道確切的行爲,你可以經常檢查reference source。例如,WhenAny可以找到here

當翻翻源,注意,返回的任務不是你的任務之一,但內部創建的任務(無論是CompleteOnInvokePromise實例或它的延續),其Result將是你的任務之一。如果您將完成的任務傳遞到WhenAny,則Result會立即設置爲遇到的第一個完成的任務。

+0

當然,這裏也有一場比賽,假設未完成的任務很熱 - 如果你有'{t1,t2,ct1,ct2}''ct'項已經完成,'t'不在調用開始時,'t1'和't2'之一可以完成*同時* WhenAny'仍然循環並設置。簡而言之 - 如果你通過一系列不完整和完整的任務,你當然不能保證已經完成的任務之一將成爲你的回報。 –