我是 RX 的新手,开始了解一些概念……我在网上找不到的概念。
我在代码中使用计时器:
Observable.Timer(TimeSpan.FromSeconds(2), schedulerProvider.CurrentThread);
// where schedulerProvider.CurrentThread is actually Scheduler.CurrentThread
我明白计时器是一个冷可观测,并且每个订阅者都会获得其私有计时器,该计时器将从订阅时开始运行 2 秒。
我正在创建那个冷可观察的thread1
并订阅它thread2
[,thread3
, thread4
etc...]
所以问题是:它将在哪个线程中运行?
请提供来源。
谢谢你!
EDIT:感谢您的详细回答。现在我知道我的问题有问题。作为第二个参数传递的调度程序是NOT用于订阅者调度,但用于运行计时器。
默认情况下,大多数 RX 操作符在同一线程上运行,但 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
评估参数.
在第一个代码块中它被捕获在创建计时器时- 换句话说,我的控制台线程。
在最后一个块中它被捕获计时器触发后所以它捕获了计时器触发的线程。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)