Kla*_*ark 2 .net parallel-processing f# asynchronous
我有一个以下列方式执行的函数:
while true
[do something]
[sleep]
Run Code Online (Sandbox Code Playgroud)
现在我想启动多个将执行相同逻辑的线程.
我尝试将我的函数包装在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
Run Code Online (Sandbox Code Playgroud)
我希望在1秒后打印所有数字,然后等待1小时以完成所有线程.但它需要更长的时间,我会在几分钟内逐个打印数字.
一种解决方案是将我的收藏管道
|> Array.map (fun x -> Task.Factory.StartNew(fun () -> domystuff x))
|> Task.WaitAll
Run Code Online (Sandbox Code Playgroud)
这是实现这一目标的正确方法吗?我当然可以选择Thread.Start,但我想要更多F#-ish.
我能够使用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
Run Code Online (Sandbox Code Playgroud)