Re[10]: [Rx] Задержать событие при условии
От: _NN_ www.nemerleweb.com
Дата: 04.12.16 12:12
Оценка:
Здравствуйте, TK, Вы писали:

TK>1. Порядок даст Concat() но, пока идет ожидание будет копиться очередь из не обработанных событий (ну и с TimeOut будут заморочки). Merge() такую очередь копить не будет но, порядок следования событий будет "сбит".

Тут то что надо.

Хочется ещё сделать небольшую оптимизацию, чтобы не ждать большой промежуток а проверять короткими промежутками и выйти по истечению времени если ничего не получилось.

Скажем такой пример:
using System;
using System.Reactive.Linq;

namespace RxTest
{
    class Program
    {
        static void Main(string[] args)
        {
            var r = Observable.Range(0, 10);

            r.Select(x => x)
                .Select(x => getY(x))
                .Concat()
                .Subscribe(x => Console.WriteLine("a: " + x));
            

            Console.ReadKey();
        }

        private static IObservable<int> getY(int i, int tries = 0)
        {
            Console.WriteLine("In getY: i = {0}, tries = {1}", i, tries);

            if (i > 5)
            {
                int y;
                if (tryGetReal(i, out y))
                {
                    // No delay
                    return Observable.Return(y);
                }
                else
                {
                    if (tries < 3)
                    {
                        // Let's Try again
                        return Observable.Defer(() => getY(i, tries + 1)).Delay(TimeSpan.FromMilliseconds(100));
                    }
                    else
                    {
                        // No more tries, stop !
                        return Observable.Empty<int>();
                    }
                }
            }
            else
            {
                return Observable.Empty<int>();
            }
        }

        private static bool tryGetReal(int i, out int y)
        {
            if (i > 7)
            {
                y = i;
                return false;
            }
            else
            {
                y = i;
                return true;
            }
        }
    }
}


Насколько это правильно ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Отредактировано 04.12.2016 12:16 _NN_ . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.