【发布时间】:2013-01-07 19:38:07
【问题描述】:
我正在查找this article on F# optimizations,并对提到Tasks.Future.Create 的行感到好奇。它似乎在将来创建一个任务,并且似乎遵循Futures and Promises 模式。在其他一些地方也提到了相同的方法,例如在 this thread on benchmarking F#, Java, C# 中,它也在 F# 代码中使用。
我想知道,上述 F# 代码(复制到此处以供参考,以防链接失效)是否与 Tasks.Task<T> 之类的代码完全一样,还是应该使用不同的线程原语?
open System.Threading
let inline sort cmp (a: _ array) =
let inline swap i j =
let t = a.[i]
a.[i] <- a.[j]
a.[j] <- t
let rec qsort l u =
if l < u then
swap l ((l + u) / 2)
let mutable m = l
for i=l+1 to u do
if cmp a.[i] a.[l] < 0 then
m <- m + 1
swap m i
swap l m
if u-l > 1000 then
let m = m
let f = Tasks.Future.Create(fun () -> qsort l (m-1))
qsort (m+1) u
f.Value
else
qsort l (m-1)
qsort (m+1) u
qsort 0 (a.Length-1)
let inline cmp (str: _ array) i j =
let rec cmp i j =
if i=str.Length then 1 else
if j=str.Length then -1 else
let c = compare str.[i] str.[j] in
if c<>0 then c else
cmp (i+1) (j+1)
cmp i j
let bwt (str: byte array) =
let n = str.Length
let a = Array.init n (fun i -> i)
sort (fun i j -> cmp str i j) a
Array.init n (fun i -> str.[(a.[i] + n - 1) % n])
注意:我猜这是 TPL 预览版中的一种方法。
【问题讨论】:
-
我认为你的猜测是正确的。看起来你想要
Task.Factory.StartNew和Task.Result(而不是Value)。 -
@Daniel:似乎很可能,感谢您查找正确的电话。我会做实验。
标签: .net multithreading f# task