Task.WaitAny的最大任务?

时间:2016-09-06 16:22:27

标签: c# multithreading asynchronous task

我正在创建一个会产生大量工作任务的系统,而在我的应用程序的某些时候,我正在执行Task.WaitAny来检索第一个完成的任务。

我关心的是我可以向WaitAny发送多少任务,我知道WaitHandle的WaitAny / All只能支持多达64个等待句柄,我不确定Task.WaitAny上的底层机制使用内部等待句柄等待已完成的任务,因此这些限制适用于它们。

与WaitHandles一样可以传递给Task.WaitAny的任务有多少限制,或者没有限制?

干杯。

2 个答案:

答案 0 :(得分:5)

从我所看到的,它通过将所有任务的延续链接起来在内部工作:http://referencesource.microsoft.com/#mscorlib/system/threading/Tasks/TaskFactory.cs,db51a91904616672
(内部优化,以及一些代码,以便在多个任务一次结束​​时处理竞速条件)

因此,WaitHandles的限制不适用于此。

答案 1 :(得分:4)

内部Task.WaitAny正在调用TaskFactory.CommonCWAnyLogic,它正在为您传入的每个任务安排延续,该延续标记数组中的哪个索引并允许任务完成。它使用了inernal类CompleteOnInvokePromise,它可以被认为是一种专门的TaskCompletionSource

因为它正在使用任务延续而不是等待句柄,所以不应该应用等待句柄限制。