Tengo una aplicación WinForm, y un conjunto observable de esta manera:cómo conseguir un contexto de sincronización WinForm o programa en un hilo 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);
Esto no funciona, ya que el l => lb.Text = l.ToString()
no se ejecutará en el hilo principal que creó el formulario, pero no puedo averiguar cómo hacerlo funcionar en este hilo. Supongo que debería usar IObservable.SubscribeOn
que toma IScheduler
o SynchronizationContext
, pero no sé cómo obtener el contexto de sincronización del hilo principal, y los únicos programadores que pude encontrar fueron las propiedades estáticas de Scheduler
, como Scheduler.CurrentThread
, Immediate
, NewThread
, TaskPool
y ThreadPool
, ninguno de los cuales funcionó.
Mi versión de Rx es 1.0.10621.
'SubscribeOn' solo establece qué hilo pasa la suscripción real, mientras que' ObserveOn' determina qué hilo se ejecutan las llamadas 'OnNext'. Para comparar con eventos, 'SubscribeOn' es como hacer que solo agregues manejadores de eventos en el hilo principal, pero' ObserveOn' se asegura de que la rutina de manejo de eventos sea llamada en el hilo correcto. –
@Gideon: Gracias. Edité mi respuesta para reflejar mi comprensión mejorada, pero tus comentarios lo resumen todo muy bien. – Boris
Si tiene una referencia a System.Reactive.Windows.Forms.dll, puede hacer .ObserveOn (formulario) y hará el equivalente a Control.Invocar. –