2016-06-13 4 views
1

У меня есть приложение reactiveui/rx. В настоящее время я разрабатываю его настольную часть, поэтому это приложение wpf. Я хотел бы создать каждое окно в отдельном потоке из-за соображений производительности.Как заставить ObserveOn() называть поток?

Вот почему мне нужно ObserveOn будет работать на текущем потоке

someCollection.Changed.Buffer(TimeSpan.FromSeconds(n)).ObserveOn(*should be a link to a current thread*).Subscribe(bufferedItems => {}) 

также, этот код расположен в портативном Lib, поэтому я не могу использовать класс System.Threading.Thread

Есть ли обходной путь?

+0

Что такое «текущая резьба»? это поток пользовательского интерфейса или это какая-нибудь случайная нить? Если это UI/основной поток, вы можете использовать 'SynchronizationContext'.Current в качестве параметра для вашего ObserveOn', но если это какой-то случайный поток, вам, вероятно, придется писать собственный планировщик (или, по крайней мере, я не знаю того, что делает это). – kha

+0

Я создаю окно в новом потоке, чтобы объект окна имел отдельный диспетчер (в соответствии с этим https://eprystupa.wordpress.com/2008/07/28/running-wpf-application-with-multiple-ui- потоки/). SynchronizationContext.Current не будет работать, поскольку он всегда будет возвращать null, если он вызван не из ui-thread. Я уже пробовал написать свой собственный планировщик, но это задача создания нового потока, а не для повторного использования существующего –

ответ

2

Если вы можете захватить Dispatcher, вы можете предоставить это DispatcherScheduler.

var currentDispatcher = Dispatcher.CurrentDispatcher; 
var scheduler = new DispatcherScheduler(currentDispatcher); 

Observable.Empty<int>().ObserveOn(scheduler).... 
+0

Да! Вот и все. Большое спасибо! –

Смежные вопросы