如何在F#中使用System.Threading.Tasks?

wli*_*iao 2 .net f#

我正在学习F#.最近,我读到了.NET 4.5关于任务的改进.所以,我看了一下如何在F#中使用它.在fsi中:

use System.Threading.Tasks
Parallel.ForEach([1;2],fun x->x+1);;
Run Code Online (Sandbox Code Playgroud)

给出了很多错误.

另外,在Fsharp核心库的源代码中.我看见:

module Parallel =
open System.Threading.Tasks

[<CompiledName("Choose")>]
let choose f (array: 'T[]) = 
  checkNonNull "array" array
  let inputLength = array.Length
  let lastInputIndex = inputLength - 1

  let isChosen : bool [] = //(Deliberately offside to avoid scrollbars)
       Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked inputLength
  let results : 'U [] = 
       Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked inputLength
Run Code Online (Sandbox Code Playgroud)

但是,我无法使用Microsoft.FSharp.Primitives.Basics.Array.zeroCreateUnchecked.为什么?我有:

错误FS1092:无法从此代码位置访问"Array"类型.

Tom*_*cek 8

您对ForEach方法的使用令人困惑,因为您的lambda函数返回结果.该ForEach操作可用于对输入中的所有元素执行某些命令操作,因此lambda函数应返回unit.以下工作正常:

open System.Threading.Tasks 

Parallel.ForEach([1;2], fun x-> 
  printfn "%d" (x+1)) |> ignore
Run Code Online (Sandbox Code Playgroud)

我还补充说ignore,因为结果ForEach返回了一些值(我们不使用它).

关于F#核心库代码 - 代码是作为F#核心库的一部分编译的,因此它可以使用一些未在公共API中公开的内部函数,因此您无法使用它们.在您的情况下,您将需要使用Array.zeroCreate而不是Array.zeroCreateUnchecked.