我有一个以下列方式执行的功能:
while true
[do something]
[sleep]
现在我想启动多个将执行相同逻辑的线程。
我尝试将我的函数包装在async {}中,并将结果汇总到Async.Parallel
和Async.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。
答案 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