F#使用异步返回值

时间:2016-09-13 09:53:24

标签: asynchronous f#

我试图学习F#,但我一直遇到问题。最新的是使用异步。在下面的代码中,我尝试运行两个长时间运行的操作并根据结果执行计算但是我得到一个错误" Async不支持+运算符"。我已经尝试过铸造等让它起作用,但我没有快速到达。

有人可以解释我出错的地方。

感谢。

let SumOfOpFaults =
    async{
        printfn "Getting Sum of Op Faults"
        return query {
            for a in AlarmResult do
            sumBy a.UserFaultTime
        }
    }

let SumOfMcFaults =
    async{
        printfn "Getting Sum of Machine Faults"
        return query {
            for a in AlarmResult do
            sumBy a.MachineFaultTime
        }
    }

[SumOfMcFaults; SumOfOpFaults]
|> Async.Parallel
|> Async.RunSynchronously
|> ignore

let total = SumOfOpFaults + SumOfMcFaults // <---Error Here

1 个答案:

答案 0 :(得分:6)

SumOfOpFaults被定义为Async<'T>。它永远不会更改为'T,因此您以后无法使用+

Async.ParallelAsync计算的任何序列转换为一个Async计算,并行运行它们并返回一个数组。

Async.RunSynchronously不会通过副作用给您结果,而是作为返回值。所以你只需要这样做:

let total =
    [SumOfMcFaults; SumOfOpFaults]
    |> Async.Parallel
    |> Async.RunSynchronously
    |> Array.sum