Подскажите как сделать такое с Rx .
Грубо говоря нужен аналог диаграммы Ганта.
Имеем источник, который генерирует события.
Каждое событие имеет свойство имя.
Мне нужно вычислить сколько раз я его получал с тем же именем, либо по прошествию таймаута если не было никаких событий.
Диаграмма:
Name |
---------------------------------------------
A | x x x (T)
B | y y y (T)
C | z z z (T)
(T) — это таймаут на определённое время.
Тут имеем событие с A три раза, а потом ждём либо ничего не получим от A и по прерыванию на таймаут выдаем время 3x + T.
Либо получаем событие с именем B и тогда выдаем время 3x + T — первый y.
Далее считаем время B , которое не прерывается ничем кроме таймаута поэтому выдаем интервал 3y + T.
И т.д.
Пытаюсь сообразить с использованием Timeout, TimeInterval , но как-то не выходит.
Здравствуйте, _NN_, Вы писали:
_NN>Мне нужно вычислить сколько раз я его получал с тем же именем, либо по прошествию таймаута если не было никаких событий.
ПО описанию до конца задачу не понял, но очень похоже на стандартный Buffer(). Стандартный — в смысле, что его почти везде используют.
Если ещё не прочитана, очень рекомендую intro to Rx.
Вот глава про time-shifted.
Здравствуйте, Sinix, Вы писали:
S>Здравствуйте, _NN_, Вы писали:
_NN>>Мне нужно вычислить сколько раз я его получал с тем же именем, либо по прошествию таймаута если не было никаких событий.
S>ПО описанию до конца задачу не понял, но очень похоже на стандартный Buffer(). Стандартный — в смысле, что его почти везде используют.
Мне нужно интервалы по имени считать.
Т.е. для A будет интервал такой, для B такой и т.д.
Прерывание подсчёта будет либо по прибытию события с другим именем либо завершается по пришествию определённого времени.
В подсчёте нет наложений.
S>Если ещё не прочитана, очень рекомендую intro to Rx. Вот глава про time-shifted.
Мне еще нравится сайт
http://reactivex.io/intro.html
Тут картинки ,которые подвигать можно, есть
Здравствуйте, _NN_, Вы писали:
_NN>>>Мне нужно вычислить сколько раз я его получал с тем же именем, либо по прошествию таймаута если не было никаких событий.
S>>ПО описанию до конца задачу не понял, но очень похоже на стандартный Buffer(). Стандартный — в смысле, что его почти везде используют.
_NN>Мне нужно интервалы по имени считать.
_NN>Т.е. для A будет интервал такой, для B такой и т.д.
_NN>Прерывание подсчёта будет либо по прибытию события с другим именем либо завершается по пришествию определённого времени.
_NN>В подсчёте нет наложений.
Используйте Observable.Window — она разобьет вам исходный поток на неперекрывающиеся потоки А, В и т.д. После этого, надо будет посчитать продолжительность выделенных интервалов:
var items = new Subject<T>();
var data = source.Do(items);
var results = data.Window(() => items.GenerateWindows(timeOut)).SelectMany(window => window.GetInterval());
Если у Вас нет паранойи, то это еще не значит, что они за Вами не следят.