2015-09-22 3 views

ответ

7

Вы можете использовать стандартные задачи .NET для этого - нет специальных F # функции или специальный синтаксис для порождения вычисления в фоновом режиме:

let a1Work = Task.Factory.StartNew(fun() -> 
    Array.map2 (fun a b->(1.0-a)/(a-b)) a2 a3) 
let b1 = Array.map2 (fun a b->a*b) b2 b3 
let a1 = a1Work.Value 

Я также изменил ваш Seq.map2 к Array.map2 - вычисления на последовательностях ленивы, и поэтому их запуск внутри задачи на самом деле ничего не сделает. С массивами весь расчет завершается немедленно.

+0

это 'a1 = a1Work.Value' или' a1 = a1Work.Result' – HaagenDaz

+0

, если есть другой цикл 'пусть c1 = Seq.map2 (весело b-> а/б) с2 c3' мне нужно чтобы установить его как задачу? – HaagenDaz

2

Если это шаблон, который вы оказываетесь регулярно использовать, это может быть полезно, чтобы написать обобщенную функцию, которая работает два Async вычисления параллельно, например, как это:

module Async = 

    let Parallel2 (a: Async<'T>) (b: Async<'U>) : Async<'T * 'U> = 
     async { 
      let! res = 
       Async.Parallel [| 
        async { let! a = a in return box a } 
        async { let! b = b in return box b } 
       |] 
      return (res.[0] :?> 'T, res.[1] :?> 'U) 
     } 

Вы можете использовать его следующим образом:

async { 
    let! a1, b1 = 
     Async.Parallel2 
      (async { return Array.map2 (fun a b->(1.0-a)/(a-b)) a2 a3 }) 
      (async { return Array.map2 (fun a b->a*b) b2 b3 }) 
    // ... 
}