As Robert explains, if you want to call WaitAll , you will need to cast the sequence of elements to the base type of Task , and then convert them to an array. You can define your extension member for Task to simplify tas:
type System.Threading.Tasks.Task with static member WaitAll(ts) = Task.WaitAll [| for t in ts -> t :> Task |]
I use array understanding and instead of Seq.cast instead of Seq.cast , because Seq.cast accepts untyped IEnumerable - so F # indicates the best type for the extension method.
Another option is to not call WaitAll at all - if you do not, the Result properties will be blocked until the task completes. This means that you will block the thread anyway (there might be a bit more locks, but I'm not sure if this affects the performance too much). If you use List.map to collect all the results, the behavior will be almost the same.
source share