无限功能并行

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.

Mar*_*zek 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
Run Code Online (Sandbox Code Playgroud)