我需要一个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
EventLoopScheduler
和NewThreadScheduler
都可以接受,具体取决于您的需要。区别主要在于:
EventLoopScheduler
采用单线程异步;即专用后台线程。如果创建此调度程序的实例并将其传递给多个运算符,则这些运算符调度的所有操作(包括但不限于对OnNext
的调用)都将排入队列并序列化到单个线程上NewThreadScheduler
采用了并发性。作为一种优化,重叠的通知将出现在同一个线程上,尽管您不应该依赖于此
他们实现了不同的目标:
-
NewThreadScheduler
将通过使用多个线程(并发)尽快向订阅者调度事件。线程将被重复使用以提高效率。选择此选项是因为您希望订阅者能够在没有其他订阅者的情况下尽快获得他们的活动。 -
EventLoopScheduler
将向同一线程上的订阅者调度事件。选择这个是因为你希望所有的事情都在一个线程上运行。