2015-08-28 21 views
5

È possibile creare un programma di pianificazione personalizzato in grado di esaminare il valore di ogni elemento che passa attraverso IObservable, al fine di decidere su quale thread elaborare l'elemento?Reactive Extensions (RX) Utilità di pianificazione personalizzata C#

Ho il requisito di elaborare elementi con lo stesso tasto sequenziale ma tasti diversi in parallelo. Sarebbe logico che RX faccia la programmazione piuttosto che lasciare l'osservabile prima di quanto mi piacerebbe per allocare ogni valore a un thread.

risposta

7

Hai provato GroupBy seguito da ObserveOn?

Qualcosa di simile:

source 
    .GroupBy(item => item.Key) 
    .SelectMany(group => group 
     .ObserveOn(Scheduler.NewThread) 
     .Select(item => process(item)) 
    ) 
    .Subscribe(processResult => ...); 

Ciò si ripartisce il flusso a chiave, avviare un nuovo thread per ogni tasto, ed eseguire process() per ogni elemento in quella chiave.

+1

Questo è molto buono. Ho appena eseguito un test su LINQPad e funziona perfettamente. Devo usare questo a volte. – Enigmativity

+0

elegante ma cosa succede se ci sono migliaia di chiavi? Idealmente, uno schedulatore può elaborare gli oggetti con la stessa chiave in sequenza usando le attività sui thread del threadpool? – benthemos

+1

Sicuro. Potresti invece voler usare 'Scheduler.Default', che userebbe il threadpool o Task a seconda della tua piattaforma. – Brandon

Problemi correlati