如何使用PFX Task.Factory.StartNew来获取参数的F#函数?

时间:2012-06-27 06:14:16

标签: .net f#

使用编程F#一书,首先给出了一个以序列形式给出的例子:

let result1 = longTask1()
let result2= = LongTask2()

然后使用PFX,它被赋予

Open System.Threading.Tasks

let taskBody = new Func<string>(longTask1)
let task = Task.Factory.StartNew<string>(taskBody)

let result2 = longTask2()
let result1 = task.Result

但是,在我的情况下,函数readBlock接受字符串filePath作为参数并返回seq。我试过这个

let taskBody = new System.Func<string, seq<_>>(readBlock)
let task = Task.Factory.StartNew<seq<_>>(taskBody.Invoke(filePath))

这显示了Task.Factory.StartNew部分的错误 - 参数太多。那么如何调用返回值的参数化函数呢?

1 个答案:

答案 0 :(得分:2)

书中的代码已经过时了。这本书是在VS 2010发布之前编写的,F#和PFX的某些部分尚未确定。

现在你可以写:

let task = Task.Factory.StartNew(fun () -> readBlock(filePath))

类型检查器会为task推断出合适的类型,您可以稍后调用task.Result来获取结果。

在闭包和System.Func<_, _>之间存在隐式转换,在这种情况下使用闭包更具可读性。