2012-01-24 11 views
6

Estoy tratando de implementar un patrón de Observer simple usando la clase .net Observable. Tengo el código que se parece a esto:.net Observable 'ObserveOn' un hilo de fondo

Observable.FromEventPattern<PropertyChangedEventArgs>(
    Instance.User, 
    "PropertyChanged") 
      .Where(e => e.EventArgs.PropertyName == "FirstName") 
      .ObserveOn(Scheduler.ThreadPool) 
      .Subscribe(search => OnFirstNameChanged(search.EventArgs)); 

Observable.FromEventPattern<PropertyChangedEventArgs>(
    Instance.User, 
    "PropertyChanged") 
      .Where(e => e.EventArgs.PropertyName == "LastName") 
      .ObserveOn(Scheduler.ThreadPool) 
      .Subscribe(search => OnLastNameChanged(search.EventArgs)); 

Quiero que los observadores se ejecuten en un subproceso de fondo, pero yo los quiero a todos corren en el mismo hilo de fondo (para nuestra implementación real, será demasiado complicado tener a cada oyente en un hilo diferente).

es decir, quiero toda la lógica OnXXXChanged a llevarse a cabo en un subproceso distinto del subproceso de interfaz de usuario, pero en lugar de Observing en todo el conjunto de subprocesos, quiero para asegurarse de que se ejecutan en el orden correcto, en el mismo hilo.

¿Cómo se debe modificar lo anterior?

Además, en una nota algo relacionada, ¿hay algún buen ejemplo de código de muestra utilizando la clase Observable para implementar este patrón?

Respuesta

13

debe crear un EventLoopScheduler y utilizar esa única instancia en todas las llamadas a ObserverOn:

var scheduler = new EventLoopScheduler(ts => new Thread(ts)); 

... .ObserveOn(scheduler). ... 

El hilo creado por el método de fábrica es el hilo utilizado para programar la ejecución de. Al salir de la propiedad ExitIfEmpty establecida en false, este subproceso no finalizará aunque no haya nada que hacer, lo que significa que se reutilizará para cada llamada.

Sin embargo, también podría considerar el uso de Scheduler.NewThread. El uso de ese programador permitirá que el hilo termine si no hay nada más que hacer. Cuando hay más trabajos en cola por ObserverOn, se creará un nuevo subproceso, pero solo debe existir un solo subproceso, lo que significa que no tiene sincronizar diferentes observadores.

Los hilos creados por EventLoopScheduler (que es utilizado por Scheduler.NewThread) se llaman Event Loop #. Verá estos nombres en el depurador.

+0

Genial, muchas gracias! – user981225

+1

EventLoopScheduler implementa IDisposable, por lo que será responsable de deshacerse de él. Puede utilizar el método de fábrica observable utilizando para vincular el tiempo de vida a la suscripción. – Fredrick

+0

Scheduler.NewThread está en desuso en este momento, en su lugar debería usar NewThreadScheduler.Default. – Kreshnik

5

.ObserveOn(Scheduler.ThreadPool) toma un programador de subprocesos que dicta el subproceso en el que se ejecuta la observación. Parece que para un único hilo que desea usar EventLoopScheduler, en lugar de ThreadPool.

+0

¡Muchas gracias! – user981225

+0

Scheduler.ThreadPool se hizo obsoleto – liang

Cuestiones relacionadas