2014-09-23 44 views
2

我需要一個STA線程與Observable.Create一起使用(調度器使用SubScribeOn方法定義)。我的問題是在Rx中創建STA線程的最佳方式是什麼。使用Reactive Extensions(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

回答

3

EventLoopSchedulerNewThreadScheduler都是可以接受的,這取決於你的需求。其實質不同在於:

  1. EventLoopScheduler採用單線程異步;即專用後臺線程。如果您創建了此調度程序的一個實例並將它傳遞給了許多運算符,那麼這些運算符安排的所有操作(包括但不限於調用OnNext)都會排隊並序列化到單個線程中。
  2. NewThreadScheduler採用併發性。作爲優化,重疊通知將出現在同一個線程上,但不應該依賴於此。
+0

戴夫比我更大,更有愛心的話。 :) +1 – 2014-09-23 11:40:21

+0

他確實... – AwkwardCoder 2014-09-23 11:50:41

+0

大聲笑。我假裝知道我在說什麼。 – 2014-09-23 11:51:00

3

他們實現不同的目標:

  • NewThreadScheduler將盡快派遣事件訂戶儘可能使用多線程(併發)。線程將被重用以提高效率。選擇這個是因爲您希望訂閱者儘快獲得他們的活動,而無需其他訂閱者持有。

  • EventLoopScheduler將在同一個線程上向訂閱者發送事件。選擇這一個,因爲你想要在一個線程上運行一切。

+0

戴夫今天拿到積分:) – AwkwardCoder 2014-09-23 11:42:45

+0

太棒了!另一個失眠的夜晚付出了代價... – 2014-09-23 11:53:42

相關問題