为什么 `CurrentThreadScheduler` 会在最外层范围内立即启动?
Why does the `CurrentThreadScheduler` launch immediately in outermost scope?
open System.Reactive.Concurrency
open System.Reactive.Disposables
open System
let print i = printfn "%i on thread %i" i Threading.Thread.CurrentThread.ManagedThreadId
CurrentThreadScheduler.Instance.Schedule((), fun _ _ ->
CurrentThreadScheduler.Instance.Schedule((), fun _ _ -> print 3)
print 2
Disposable.Empty
)
print 1
输出:
2 on thread 1
3 on thread 1
1 on thread 1
为什么 print 1
运行 位于最外层范围内?为什么它前面的语句没有排队并立即执行,不像 CurrentThreadScheduler.Instance.Schedule((), fun _ _ -> print 3)
?
CurrentThreadScheduler
将:
- 运行 一声巨响
- 如果 thunk 被安排在
t
秒后,它将休眠 t
秒
- 如果 thunk 已经 运行ning,它将被添加到队列中。
遵守这 3 条规则:
- 第一个计划项目是 运行 立即(打印 2)
- 第一个项目仍在 运行ning 中,而第二个项目已安排,因此它排队
- 第一项完成,出队,第二项是运行(打印3)
- 调度程序完成阻塞,所以最后一行执行(打印 1)
见CurrentThreadScheduler implementation。
ImmediateScheduler
相比之下只是 "run a thunk immediately".
open System.Reactive.Concurrency
open System.Reactive.Disposables
open System
let print i = printfn "%i on thread %i" i Threading.Thread.CurrentThread.ManagedThreadId
CurrentThreadScheduler.Instance.Schedule((), fun _ _ ->
CurrentThreadScheduler.Instance.Schedule((), fun _ _ -> print 3)
print 2
Disposable.Empty
)
print 1
输出:
2 on thread 1
3 on thread 1
1 on thread 1
为什么 print 1
运行 位于最外层范围内?为什么它前面的语句没有排队并立即执行,不像 CurrentThreadScheduler.Instance.Schedule((), fun _ _ -> print 3)
?
CurrentThreadScheduler
将:
- 运行 一声巨响
- 如果 thunk 被安排在
t
秒后,它将休眠t
秒 - 如果 thunk 已经 运行ning,它将被添加到队列中。
遵守这 3 条规则:
- 第一个计划项目是 运行 立即(打印 2)
- 第一个项目仍在 运行ning 中,而第二个项目已安排,因此它排队
- 第一项完成,出队,第二项是运行(打印3)
- 调度程序完成阻塞,所以最后一行执行(打印 1)
见CurrentThreadScheduler implementation。
ImmediateScheduler
相比之下只是 "run a thunk immediately".