我正在创建一个会产生大量工作任务的系统,而在我的应用程序的某些时候,我正在执行Task.WaitAny来检索第一个完成的任务。
我关心的是我可以向WaitAny发送多少任务,我知道WaitHandle的WaitAny / All只能支持多达64个等待句柄,我不确定Task.WaitAny上的底层机制使用内部等待句柄等待已完成的任务,因此这些限制适用于它们。
与WaitHandles一样可以传递给Task.WaitAny的任务有多少限制,或者没有限制?
干杯。
答案 0 :(得分:5)
从我所看到的,它通过将所有任务的延续链接起来在内部工作:http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/TaskFactory.cs,db51a91904616672
(内部优化,以及一些代码,以便在多个任务一次结束时处理竞速条件)
因此,WaitHandles的限制不适用于此。
答案 1 :(得分:4)
内部Task.WaitAny
正在调用TaskFactory.CommonCWAnyLogic
,它正在为您传入的每个任务安排延续,该延续标记数组中的哪个索引并允许任务完成。它使用了inernal类CompleteOnInvokePromise
,它可以被认为是一种专门的TaskCompletionSource
。
因为它正在使用任务延续而不是等待句柄,所以不应该应用等待句柄限制。