使用Reactive Extensions(Rx)调度程序时创建STA线程

时间:2014-09-23 11:05:35

标签: .net system.reactive

我需要一个STA线程与Observable.Create一起使用,(调度程序是使用SubScribeOn方法定义的)。我的问题是在Rx中创建STA线程的最佳方法是什么。

目前我使用NewThreadScheduler,但我可以使用EventLoopScheduler。

哪个更适合创建STA线程?

Func<ThreadStart, Thread> func = x =>
{
  var thread = new Thread(x) { IsBackground = true };
  thread.SetApartmentState(ApartmentState.STA);

  return thread;
};

return new NewThreadScheduler(func); 

.Net版本:4.0(WPF)

Rx版本:2.0.21103.1

2 个答案:

答案 0 :(得分:3)

他们实现了不同的目标:

  • NewThreadScheduler将通过使用多个线程(并发)尽快将事件分派给订阅者。线程将被重用以提高效率。选择此选项是因为您希望订阅者尽快收到他们的活动,而不会让其他订阅者举起来。

  • EventLoopScheduler会将事件分派给同一线程上的订阅者。选择这个,因为你想在一个线程上运行所有东西。

答案 1 :(得分:3)

EventLoopSchedulerNewThreadScheduler都可以接受,具体取决于您的需求。区别在于:

  1. EventLoopScheduler使用单线程异步;即专用的后台线程。如果您创建此调度程序的实例并将其传递给许多运算符,那么这些运算符调度的所有操作(包括但不限于对OnNext的调用)都会排队并序列化到单个线程上。
  2. NewThreadScheduler使用并发。作为优化,重叠通知将出现在同一个线程上,但您不应该依赖它。