使用编程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部分的错误 - 参数太多。那么如何调用返回值的参数化函数呢?
答案 0 :(得分:2)
书中的代码已经过时了。这本书是在VS 2010发布之前编写的,F#和PFX的某些部分尚未确定。
现在你可以写:
let task = Task.Factory.StartNew(fun () -> readBlock(filePath))
类型检查器会为task
推断出合适的类型,您可以稍后调用task.Result
来获取结果。
在闭包和System.Func<_, _>
之间存在隐式转换,在这种情况下使用闭包更具可读性。