Cold observable 的 Scheduler.CurrentThread - 它会在哪个线程中 运行?

Cold observable's Scheduler.CurrentThread - in which thread will it run?

我是 RX 的新手,开始理解一些概念.. 我在网上找不到的那个。

我在代码中使用了计时器:

Observable.Timer(TimeSpan.FromSeconds(2), schedulerProvider.CurrentThread);
// where schedulerProvider.CurrentThread is actually Scheduler.CurrentThread

我知道 Timer 是一个 Cold Observable,每个订阅者都会得到它的私有定时器,从订阅时起 运行 持续 2 秒。

我正在 thread1 中创建冷观察对象并使用 thread2 [ thread3, thread4 等...]

所以问题是:它将在哪个线程中 运行?

请提供来源。

谢谢!

编辑: 感谢您的详细回答。现在我知道我的问题有一个作为第二个参数传递的 issue.The 调度程序是 NOT 用于订阅者调度,但用于 运行 定时器。 默认情况下,大多数 RX 运算符 运行s 在同一线程上,但 Timer 是(几个)例外之一。默认情况下,计时器本身将 运行 放在线程池上,并在其同一线程上调用 OnNext。如果你要求它使用 CurrentThread 调度器,定时器本身将 运行 在同一个线程上(就像大多数 Rx 操作符一样)并且订阅者将在同一个线程上被调用。 (尽管对于常规用例,这不是很推荐)。

为什么不做 运行 一些测试来找出答案?

这是我所做的:

Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

Observable
    .Timer(TimeSpan.FromSeconds(2.0), Scheduler.CurrentThread)
    .Subscribe(x => Console.WriteLine(Thread.CurrentThread.ManagedThreadId));

出品:

12
12

然后我试了这个:

Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

Observable
    .Timer(TimeSpan.FromSeconds(2.0))
    .Subscribe(x => Console.WriteLine(Thread.CurrentThread.ManagedThreadId));

产生了:

12
13
Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

Observable
    .Timer(TimeSpan.FromSeconds(2.0))
    .ObserveOn(Scheduler.CurrentThread)
    .Subscribe(x => Console.WriteLine(Thread.CurrentThread.ManagedThreadId));

产生了:

11
27

所有这些归结为 Scheduler.CurrentThread 在计算 Scheduler.CurrentThread 参数时捕获当前线程上下文

在第一个代码块中,它是在创建计时器时捕获的 - 换句话说,我的控制台线程。

在最后一个块中,它在定时器触发后被捕获,因此它捕获了定时器触发的线程。