Использование Async.Parallel
представляется правильным. Цифры действительно выглядят подозрительно, но я не сразу вижу, в чем здесь проблема.
В любом случае асинхронные рабочие процессы действительно больше подходят для вычислений, которые включают в себя некоторые асинхронные операции (такие как ввод-вывод, обмен данными, ожидание событий и т. Д.). Для задач, интенсивно использующих процессор, лучше использовать Parallel Extensions to .NET (которые теперь являются частью .NET 4.0; к сожалению, нет версии .NET 2.0).
Чтобы сделать это из F #, вам понадобится F # PowerPack и сборка FSharp.PowerPack.Parallel.Seq.dll
, которая содержит параллельные версии функций высшего порядка для работы с последовательностями (например, map
:-) )
Эти функции возвращают значение типа pseq<'a>
(называемое ParallelQuery<T>
в C #), которое представляет отложенное вычисление, выполняемое параллельно (это обеспечивает лучшую оптимизацию при использовании нескольких операций в конвейере). Также есть функция PSeq.reduce
, поэтому вы можете использовать ее и при обработке (кроме PSeq.map
).