为什么 `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 将:

  1. 运行 一声巨响
  2. 如果 thunk 被安排在 t 秒后,它将休眠 t
  3. 如果 thunk 已经 运行ning,它将被添加到队列中。

遵守这 3 条规则:

  1. 第一个计划项目是 运行 立即(打印 2)
  2. 第一个项目仍在 运行ning 中,而第二个项目已安排,因此它排队
  3. 第一项完成,出队,第二项是运行(打印3)
  4. 调度程序完成阻塞,所以最后一行执行(打印 1)

CurrentThreadScheduler implementation

ImmediateScheduler 相比之下只是 "run a thunk immediately".