12
我有一個WinForm應用程序一個WinForm同步上下文或時間表,以及可觀察到的設立是這樣的:如何獲得一個WinForm線程
Form form = new Form();
Label lb = new Label();
form.Controls.Add(lb);
Observable.Interval(TimeSpan.FromSeconds(1))
.Subscribe(l => lb.Text = l.ToString());
Application.Run(form);
這不起作用,因爲l => lb.Text = l.ToString()
就不會運行在創建窗體的主線程上,但我無法弄清楚如何讓它在這個線程上運行。我假設,我應該使用IObservable.SubscribeOn
,它可以採用IScheduler
或SynchronizationContext
,但我不知道如何獲取主線程的同步上下文,並且唯一可以找到的調度程序是Scheduler
的靜態屬性,例如Scheduler.CurrentThread
,Immediate
,NewThread
,TaskPool
和ThreadPool
,其中沒有一個工作。
我的Rx版本是1.0.10621。
'SubscribeOn'只設置發生實際訂閱的線程,而'ObserveOn'確定執行'OnNext'調用的線程。爲了與事件進行比較,'SubscribeOn'就像讓你只在主線程中添加事件處理程序,但是'ObserveOn'確保事件處理例程在正確的線程中被調用。 –
@Gideon:謝謝。我編輯了我的答案,以反映我對改進的理解,但您的意見總結得很好。 – Boris
如果您有System.Reactive.Windows.Forms.dll的引用,您可以執行.ObserveOn(表單),它將執行與Control.Invoke等效的操作。 –