Cold Observable的Scheduler.CurrentThread-将在哪个线程中运行?

时间:2018-08-01 14:17:21

标签: c# .net system.reactive

我是RX的新手,开始了解一些概念,这是我在网上找不到的。

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

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

我了解到Timer是一个可观察的,并且每个订阅者都将获得其私有定时器,该定时器将从订阅之日起运行2秒钟。

我正在 thread1 中创建该可观察到的寒冷,并使用 thread2 [, thread3 thread4 等...]

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

请提供来源。

谢谢!

编辑:感谢您的详细回答。现在我知道我的问题出了问题。作为第二个参数传递的调度程序对于订阅者调度,是,但对于运行计时器而言。 默认情况下,大多数RX运算符在同一线程上运行,但是Timer是其中之一。默认情况下,计时器本身将在线程池上运行,并在同一线程上调用OnNext。如果您要求它使用CurrentThread调度程序,则计时器本身将在同一线程上运行(就像大多数Rx运算符一样),并且订阅者将在同一线程上被调用。 (尽管对于常规用例,不建议这样做。)

1 个答案:

答案 0 :(得分:2)

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

这就是我所做的:

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参数时捕获了当前线程上下文

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

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