代码之家  ›  专栏  ›  技术社区  ›  Yitzchak

cold observable的scheduler.currenthread-它将在哪个线程中运行?

  •  1
  • Yitzchak  · 技术社区  · 6 年前

    我刚接触RX,开始了解一些概念。我在网上找不到的那个。

    我在代码中使用计时器:

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

    我知道计时器是 冷观测 ,每个订阅服务器都将获得其专用计时器,该计时器将在订阅后运行2秒。

    我创造了在 thread1 并用 thread2 [ thread3 , thread4 等等…

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

    请提供来源。

    谢谢您!

    编辑: 谢谢你的详细回答。现在我知道我的问题出了问题。作为第二个参数传递的调度程序是 不是 用于订阅服务器调度,但用于运行计时器。 默认情况下,大多数RX操作员都在同一线程上运行,但计时器是一个(多个)例外。默认情况下,计时器本身将在线程池上运行,并在同一线程上调用onnext。如果您要求它使用当前线程调度程序,则计时器本身将在同一线程上运行(与大多数RX操作员一样),并且将在同一线程上调用订阅服务器。(但对于常规用例,这不是很推荐的)。

    1 回复  |  直到 6 年前
        1
  •  2
  •   Enigmativity    6 年前

    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