Ho un'applicazione WinForm, e un set osservabile in questo modo:Come ottenere un contesto di sincronizzazione WinForm o un programma su un thread 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);
Questo non funziona, dal momento che non viene eseguito il l => lb.Text = l.ToString()
sul thread principale che ha creato il modulo, ma non riesco a capire come farlo funzionare su questo thread. Presumo, che dovrei usare IObservable.SubscribeOn
che accetta uno IScheduler
o uno SynchronizationContext
, ma non so come ottenere il sincronizationcontext del thread principale, e gli unici Scheduler che ho trovato erano le proprietà statiche di Scheduler
, come Scheduler.CurrentThread
, Immediate
, NewThread
, TaskPool
e ThreadPool
, nessuno dei quali ha funzionato.
La mia versione Rx è 1.0.10621.
"SubscribeOn" imposta solo il thread su cui si verifica la sottoscrizione effettiva, mentre "ObserveOn" determina quale thread vengono eseguite le chiamate "OnNext". Per il confronto con gli eventi, 'SubscribeOn' è come farti aggiungere solo gestori di eventi sul thread principale, ma' ObserveOn' si assicura che la routine di gestione degli eventi venga chiamata sul thread corretto. –
@Gideon: Grazie. Ho modificato la mia risposta per riflettere la mia comprensione migliorata, ma i tuoi commenti riassumono tutto molto bene. – Boris
Se si dispone di un riferimento a System.Reactive.Windows.Forms.dll, è possibile eseguire .ObserveOn (modulo) e farà l'equivalente di Control.Invoke. –