请考虑以下代码:
open System
open System.Threading
ThreadPool.SetMinThreads (1, 1) |> ignore
ThreadPool.SetMaxThreads (1, 1) |> ignore
let asyncOp i = async {
printfn "started %i" i
do! Async.Sleep 1000
printfn "finished %i" i }
for i = 1 to 3 do Async.Start <| asyncOp i
printfn "read"
Console.ReadLine () |> ignore
我理解,套用SetMaxThreads
的文档,只有一个对线程池的请求可以同时处于活动状态,而其他请求将保持排队状态,直到线程可用.它是打印的
read
started 1
started 2
started 3
finished 3 // after a second
finished 2
finished 1
顺便问一句,为什么"完成"的行会以相反的顺序打印?
现在将do!
更改为Async.RunSynchronously <|
.这一次我们只得到
read
started 1
为什么它会止步于此?我希望得到的结果与将整行替换为Thread.Sleep 1000
时得到的结果相同:
read
started 1
finished 1 // after a second
started 2
finished 2 // after a second
started 3
finished 3 // after a second
是因为RunSynchronously
试图创建一个新的线程池线程吗?(我不确定它是否会这样做.)