我需要一个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
答案 0 :(得分:3)
他们实现了不同的目标:
NewThreadScheduler
将通过使用多个线程(并发)尽快将事件分派给订阅者。线程将被重用以提高效率。选择此选项是因为您希望订阅者尽快收到他们的活动,而不会让其他订阅者举起来。
EventLoopScheduler
会将事件分派给同一线程上的订阅者。选择这个,因为你想在一个线程上运行所有东西。
答案 1 :(得分:3)
EventLoopScheduler
和NewThreadScheduler
都可以接受,具体取决于您的需求。区别在于:
EventLoopScheduler
使用单线程异步;即专用的后台线程。如果您创建此调度程序的实例并将其传递给许多运算符,那么这些运算符调度的所有操作(包括但不限于对OnNext
的调用)都会排队并序列化到单个线程上。NewThreadScheduler
使用并发。作为优化,重叠通知将出现在同一个线程上,但您不应该依赖它。