Rx с внешними состояниями?Rx с внешними состояниями
Итак, в этом примере есть функциональность Rx, объединенная с полным поведением внешнего состояния. Каков наилучший подход с Rx для достижения этого?
Проблемные кодовые места с «updateActive».
public enum Source
{
Observable1,
Observable2,
}
// Type is Source.Observable1
IObservable<Source> observable1;
// Type is Source.Observable2
IObservable<Source> observable2;
var mergedObservables = observable1.Select(x => Source.Observable1)
.Merge(observable2.Select(x => Source.Observable2));
var updateActive = false;
mergedObservables.Subscribe(x =>
{
switch (x.Source)
{
case Source.Observable1:
{
if (updateActive)
break;
updateActive = true;
// Here is some code which causes that observable2 will get some new values.
// (this coud be also on an other thread)
// If this is the case, the new value(s) should be ignored.
updateActive = false;
}
break;
case Source.Observable2:
{
if (updateActive)
break;
updateActive = true;
// Here is some code which causes that observable1 will get some new values.
// (this coud be also on an other thread)
// If this is the case, the new value(s) should be ignored.
updateActive = false;
}
break;
}
});
Примечание: Как я могу транспортировать состояние «updateActive» в операторах Rx
Почему вы объединяете эти два потока, если затем вы разделите логику с помощью инструкции switch? – galenus
Это была первоначальная идея объединить их, чтобы их можно было обрабатывать через Rx-операторы. Если бы было 2 отдельных потока, то это точно как обычная обработка событий, и я хочу избежать этого. Чтобы уточнить вопрос: как я могу транспортировать состояние updateActive в операторы Rx. – BIQAS
Технически этот подход является вполне разумным, если вы блокируете 'updateActive' в правильных местах. Как выглядит пропущенный код? Является ли текущая работа представленной объектом 'Task'? Если это так, я мог бы подумать о том, как это сделать. –