C# 冷可观察到';s Scheduler.CurrentThread-它将在哪个线程中运行?

C# 冷可观察到';s Scheduler.CurrentThread-它将在哪个线程中运行?,c#,.net,system.reactive,C#,.net,System.reactive,我是RX的新手,开始理解一些概念。。我在网上找不到的那个 我正在代码中使用计时器: Observable.Timer(TimeSpan.FromSeconds(2), schedulerProvider.CurrentThread); // where schedulerProvider.CurrentThread is actually Scheduler.CurrentThread 据我所知,定时器是一个冷可观察的,每个订阅者都将获得其私人定时器,该定时器将从订阅时起运行2秒 我在thre

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

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

Observable.Timer(TimeSpan.FromSeconds(2), schedulerProvider.CurrentThread);
// where schedulerProvider.CurrentThread is actually Scheduler.CurrentThread
据我所知,定时器是一个冷可观察的,每个订阅者都将获得其私人定时器,该定时器将从订阅时起运行2秒

我在
thread1
中创建可观察到的冷态,并使用
thread2
[,
thread3
thread4
等订阅它

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

请提供来源

谢谢大家!

编辑:谢谢您的详细回答。现在我知道我的问题有一个问题。作为第二个参数传递的调度程序不是用于订阅者调度的,而是用于运行计时器的。
默认情况下,大多数RX操作符在同一线程上运行,但计时器是(几个)例外之一。默认情况下,计时器本身将在线程池上运行,并在同一线程上调用OnNext。如果您要求它使用CurrentThread scheduler,计时器本身将在同一线程上运行(与大多数Rx操作符一样),订阅者将在同一线程上调用。(虽然对于常规用例,这不是很推荐。)

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

以下是我所做的:

Console.WriteLine(Thread.CurrentThread.ManagedThreadId);

Observable
    .Timer(TimeSpan.FromSeconds(2.0), Scheduler.CurrentThread)
    .Subscribe(x => Console.WriteLine(Thread.CurrentThread.ManagedThreadId));
会议产生了:

12 12 12 13 11 27 这产生了:

12 12 12 13 11 27 这产生了:

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

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


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

很抱歉我的反应太晚,我很忙,我喜欢你的答案,我觉得这里缺少了一些东西,你帮了我很大的忙,但我正在等待,直到我验证你的答案。谢谢,谢谢,现在我完全明白这是怎么回事了。但我不同意你的部分解释:在第一段代码中,它是在创建计时器时捕获的——换句话说,是我的控制台线程。我认为这是错误的,因为Observable.Timer()docs:返回一个可观察序列,该序列在指定的相对到期时间过后生成一个值,使用指定的调度程序运行计时器。因此,第一个示例在控制台线程中运行计时器,然后在同一线程上调用OnNext()。请编辑您的答案以反映该小修复=]@Yitzchak-感谢您的反馈,但我确实将我的答案“在创建计时器时”理解为“使用指定的计划程序运行计时器”。你能解释为什么你看到了不同吗?事实上你是对的,只是我的问题错了,我已经编辑过了。谢谢(在很多情况下你给了我很多答案)