无限功能并行

时间:2014-02-25 17:31:11

标签: .net asynchronous f# parallel-processing

我有一个以下列方式执行的功能:

while true
  [do something]
  [sleep]

现在我想启动多个将执行相同逻辑的线程。

我尝试将我的函数包装在async {}中,并将结果汇​​总到Async.ParallelAsync.RunSynchronously,但我只得到列表中的第一个函数。

我试图将我的问题归结为以下示例:

[1..100]
|> Seq.map (fun x -> 
    async {
        Thread.Sleep(1000)
        printfn "%i" x
        Thread.Sleep(TimeSpan.FromHours(1.))})
|> Async.Parallel
|> Async.Ignore
|> Async.RunSynchronously

我想在这里获得1秒后打印的所有数字,然后等待1小时以完成所有线程。但这需要更长的时间,我会在几分钟内逐个打印数字。

一种解决方案是将我的收藏管道传输到

|> Array.map (fun x -> Task.Factory.StartNew(fun () -> domystuff x))
|> Task.WaitAll

这是实现这个目标的正确方法吗?我当然可以选择Thread.Start但我想要更多的东西F#-ish。

1 个答案:

答案 0 :(得分:5)

我可以使用Async.Sleep代替Thread.Sleep来获得您想要的结果:

[1..100]
|> Seq.map (fun x -> 
    async {
        do! Async.Sleep(1000)
        printfn "%i" x
        do! Async.Sleep(int (TimeSpan.FromHours(1.).TotalMilliseconds))})
|> Async.Parallel
|> Async.Ignore
|> Async.RunSynchronously