bir WinForm iş parçacığı üzerinde ve gözlemlenebilir bir dizi kalkmak: Bu işe yaramazsanasıl böyle bir WinForm senkronizasyon bağlamı veya zamanlamasını bir winform uygulama var
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()
çalıştırılamaz çünkü formu oluşturan ana iş parçacığı üzerinde, ancak bu iş parçacığı üzerinde nasıl çalıştırılacağını anlayamıyorum. Sanırım, IScheduler
ya da SynchronizationContext
alan bir IObservable.SubscribeOn
kullanmalıyım, ancak ana iş parçacığının synchronizationcontext'i nasıl elde edeceğimi bilmiyorum ve bulabildiğim tek Zamanlayıcılargibi Scheduler.CurrentThread
gibi statik özelliklerdi Immediate
, NewThread
, TaskPool
ve ThreadPool
, bunların hiçbiri işe yaramadı.
Rx sürümüm 1.0.10621'dir.
'SubscribeOn' yalnızca gerçek aboneliğin hangi iş parçacığı olduğunu ayarlar, 'ObserveOn', 'OnNext' çağrılarının hangi iş parçacığının çalıştırılacağını belirler. Olaylarla karşılaştırmak için 'SubscribeOn', yalnızca ana iş parçacığına olay işleyicileri eklemenizi sağlamak gibidir, ancak' ObserveOn', olay işleme rutininin doğru iş parçacığına çağrıldığından emin olur. –
@Gideon: Teşekkürler. Geliştirdiğim anlayışı yansıtmak için cevabımı düzenledim, ancak yorumlarınız bunu çok iyi özetliyor. – Boris
Eğer System.Reactive.Windows.Forms.dll bir başvuru var .ObserveOn (form) yapabilir ve Control.Invoke eşdeğerini yapacaktır. –