2012-06-27 29 views
1

使用编程F#书,有先给出串行为例:使用它被赋予为如何使用PFX Task.Factory.StartNew获取参数的F#函数?

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取PFX

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

然后以字符串filePath作为参数并返回seq。我试过这样

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

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

回答

2

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

现在你可以这样写:

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

类型检查将推断适当的类型task,并且可以调用task.Result让后来的结果。

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

+0

谢谢。作品。通过函数readBlock()的名称替换taskBody(),事情都很好。不知道那本书已经过时了... – AruniRC