2

使用Programming F# book,有一个示例首先作为串行给出:

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 部分的错误 - 参数太多。那么如何调用返回值的参数化函数呢?

4

1 回答 1

2

书中的代码已经过时了。这本书是在VS 2010发布之前写的,F#和PFX的一些部分还没有解决。

现在你可以写:

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

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

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

于 2012-06-27T06:53:03.020 回答