Re[8]: Reactive Extensions
От: _NN_ www.nemerleweb.com
Дата: 24.11.19 22:00
Оценка:
Здравствуйте, Shmj, Вы писали:


S>Давайте весь код, чтобы сразу запустить. Я дал весь, на форму только кинуть 2 TextBox.

Давайте тогда ваш пример на GitHub, чтобы и ваш запустить, туда и код с Rx можно добавить будет для сравнения
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[9]: Reactive Extensions
От: Shmj Ниоткуда  
Дата: 24.11.19 23:04
Оценка:
Здравствуйте, _NN_, Вы писали:

S>>Давайте весь код, чтобы сразу запустить. Я дал весь, на форму только кинуть 2 TextBox.

_NN>Давайте тогда ваш пример на GitHub, чтобы и ваш запустить, туда и код с Rx можно добавить будет для сравнения

А что на Rx получается такой большой код, что нужен GitHub?
Re[8]: Reactive Extensions
От: okon  
Дата: 25.11.19 04:53
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, okon, Вы писали:


O>>
O>>inputObservable
O>>      .Throttle(500)
O>>      .CombineLatest(input => GetList(input))
O>>      .OnNext( result => texbBox.text = result );
O>>


O>>Ну и по событию кидать в inputObservable новые данные


S>Давайте весь код, чтобы сразу запустить. Я дал весь, на форму только кинуть 2 TextBox.


S>И добавьте textBox2.Clear(); после задержки в 500 мс.


Сори, но мне лично лень делать под тебя отдельный проект и проверять компиляцию.
Я показал как выглядит решение на Rx, если тебя прям весь код интересует то могу написать примерно с точностью до типов, а дальше сам ковыряй.
Те количество строк не должно измениться в решении , это все решение :


   Observable<string[]> inputObservable = new Observable<string[]>();

   // любое место где инициализация формы
   void Init()
   {
    inputObservable
         .Throttle(500) 
         .CombineLatest(input => GetList(input))
         .Subscribe( result => texbBox.text = result );
   }

   void KeyDown(EventArgs e) => inputObservable.OnNext(e);



Вот это твой эквивалент этой же логики

 private volatile int _lastRequestId;

        private void textBox1_KeyUp(object sender, KeyEventArgs e)
        {
            _lastRequestId++;
            FillItems();
        }

        private async void FillItems()
        {
            var requestId = _lastRequestId;

            await Task.Delay(500);

            if (requestId != _lastRequestId)
                return;

            textBox2.Clear();

            var items = await MakeRequest(textBox1.Text);

            if (_lastRequestId != requestId)
                return;

            textBox2.Text = string.Join("\r\n", items);
        }
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Отредактировано 25.11.2019 5:02 okon . Предыдущая версия . Еще …
Отредактировано 25.11.2019 4:57 okon . Предыдущая версия .
Re[10]: Reactive Extensions
От: _NN_ www.nemerleweb.com
Дата: 25.11.19 04:56
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, _NN_, Вы писали:


S>>>Давайте весь код, чтобы сразу запустить. Я дал весь, на форму только кинуть 2 TextBox.

_NN>>Давайте тогда ваш пример на GitHub, чтобы и ваш запустить, туда и код с Rx можно добавить будет для сравнения

S>А что на Rx получается такой большой код, что нужен GitHub?


Чтобы избежать недопониманий.
Я точно также не могу взять ваш код и скомпилировать, нужен код всего проекта.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[11]: Reactive Extensions
От: paradoks  
Дата: 25.11.19 10:06
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Я точно также не могу взять ваш код и скомпилировать, нужен код всего проекта.



так код с Rx не воспроизводит всех возможностей первого кода...потому просто не конкурент и 1-е решение лучше и гибче.
в частности если послан запрос, 500 мс прошло, еще ввод, ответ (5сек) еще не пришел ... пошлетcя еще запрос не дождавшись предыдущего ответа?
Отредактировано 25.11.2019 13:39 paradoks . Предыдущая версия . Еще …
Отредактировано 25.11.2019 12:18 paradoks . Предыдущая версия .
Re[12]: Reactive Extensions
От: okon  
Дата: 25.11.19 13:10
Оценка:
Здравствуйте, paradoks, Вы писали:

P>Здравствуйте, _NN_, Вы писали:


_NN>>Я точно также не могу взять ваш код и скомпилировать, нужен код всего проекта.



P>так код с Rx не воспроизводит всех возможностей первого кода...потому просто не конкурент и 1-е решение лучше и гибче.




Почему ? Как раз воспроизводит без лишнего кода.
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[13]: Reactive Extensions
От: paradoks  
Дата: 25.11.19 13:41
Оценка:
Здравствуйте, okon, Вы писали:

O>Здравствуйте, paradoks, Вы писали:


P>>Здравствуйте, _NN_, Вы писали:


_NN>>>Я точно также не могу взять ваш код и скомпилировать, нужен код всего проекта.



P>>так код с Rx не воспроизводит всех возможностей первого кода...потому просто не конкурент и 1-е решение лучше и гибче.




O>Почему ? Как раз воспроизводит без лишнего кода.


а где второй таймаут на 5 сек?
Re[9]: Reactive Extensions
От: Shmj Ниоткуда  
Дата: 25.11.19 13:42
Оценка:
Здравствуйте, okon, Вы писали:

O>Вот это твой эквивалент этой же логики


А где:

textBox2.Clear();


?
Re[14]: Reactive Extensions
От: okon  
Дата: 25.11.19 14:21
Оценка:
O>>Почему ? Как раз воспроизводит без лишнего кода.

P>а где второй таймаут на 5 сек?


А что за таймаут на 5 сек ?

Покажи часть кода и выдели где это.
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[10]: Reactive Extensions
От: okon  
Дата: 25.11.19 14:24
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, okon, Вы писали:


O>>Вот это твой эквивалент этой же логики


S>А где:


S>
S>textBox2.Clear();
S>


S>?


Добавь строчку

...
.Throttle(500)
.Subscribe( input => textBox2.Clear() )
.CombineLatest( input => GetList(input))
.Subscribe( result => textBox2.text = result );
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[15]: Reactive Extensions
От: paradoks  
Дата: 25.11.19 14:41
Оценка:
Здравствуйте, okon, Вы писали:



O>>>Почему ? Как раз воспроизводит без лишнего кода.


P>>а где второй таймаут на 5 сек?


O>А что за таймаут на 5 сек ?


O>Покажи часть кода и выдели где это.


врем ожидания ответа 0.1 — 5 сек
значит поле 5 сек надо что-то сделать. убить запрос и тд.
Re[9]: Reactive Extensions
От: Shmj Ниоткуда  
Дата: 25.11.19 15:20
Оценка: -1
Здравствуйте, okon, Вы писали:

O> Observable<string[]> inputObservable = new Observable<string[]>();


Error CS0308 The non-generic type 'Observable' cannot be used with type arguments
Re[16]: Reactive Extensions
От: okon  
Дата: 25.11.19 15:25
Оценка:
Здравствуйте, paradoks, Вы писали:

P>Здравствуйте, okon, Вы писали:




O>>>>Почему ? Как раз воспроизводит без лишнего кода.


P>>>а где второй таймаут на 5 сек?


O>>А что за таймаут на 5 сек ?


O>>Покажи часть кода и выдели где это.


P>врем ожидания ответа 0.1 — 5 сек

P>значит поле 5 сек надо что-то сделать. убить запрос и тд.

А где в решении без Rx убивается запрос и т.д. ? не вижу.
В Rx там достаточно просто делается , добавляется .Timeout(TimeSpan.FromMilliseconds(1000))
”Жить стало лучше... но противнее. Люди которые ставят точку после слова лучше становятся сторонниками Путина, наши же сторонники делают акцент на слове противнее ( ложь, воровство, лицемерие, вражда )." (с) Борис Немцов
Re[9]: Reactive Extensions
От: Shmj Ниоткуда  
Дата: 25.11.19 15:36
Оценка: -2
Здравствуйте, okon, Вы писали:

O>

O>   Observable<string[]> inputObservable = new Observable<string[]>();

O>   // любое место где инициализация формы
O>   void Init()
O>   {
O>    inputObservable
O>         .Throttle(500) 
O>         .CombineLatest(input => GetList(input))
O>         .Subscribe( result => texbBox.text = result );
O>   }

O>   void KeyDown(EventArgs e) => inputObservable.OnNext(e);
O>



O>Вот это твой эквивалент этой же логики


А теперь вопрос: с чего вы взяли, что ваш код проще? Лишь потому что он записан в одну очень очень длинную строку?
Re[10]: Reactive Extensions
От: Danchik Украина  
Дата: 25.11.19 17:05
Оценка: +1
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, okon, Вы писали:


O>>

O>>   Observable<string[]> inputObservable = new Observable<string[]>();

O>>   // любое место где инициализация формы
O>>   void Init()
O>>   {
O>>    inputObservable
O>>         .Throttle(500) 
O>>         .CombineLatest(input => GetList(input))
O>>         .Subscribe( result => texbBox.text = result );
O>>   }

O>>   void KeyDown(EventArgs e) => inputObservable.OnNext(e);
O>>



O>>Вот это твой эквивалент этой же логики


S>А теперь вопрос: с чего вы взяли, что ваш код проще? Лишь потому что он записан в одну очень очень длинную строку?


Намного проще, точнее логику описываешь в одном месте, а не балуешься с флажками и сложными условиями.
Сложность здесь в том что надо перевернуть мозги. Например всех тонкостей я так и не познал.
Из минусов что я нашел — если где-то в звене, какой-то подписчик бросит исключение, то вся цепь отвалится.
Re[11]: Reactive Extensions
От: Shmj Ниоткуда  
Дата: 25.11.19 17:22
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Намного проще, точнее логику описываешь в одном месте, а не балуешься с флажками и сложными условиями.


Нет, не проще. Давайте полный код, мне лень писать, т.к. мысль об Observable вызывает у меня боль.

Для Task-ов я написал.

D>Сложность здесь в том что надо перевернуть мозги. Например всех тонкостей я так и не познал.


Обман. Я работал с ними в 2012 году где-то месяца 3 довольно плотно и познал все тонкости. Но потом, когда необходимость такая отпала — вздохнул с облегчением и почти все забыл, вспоминать желания не возникает.

D>Из минусов что я нашел — если где-то в звене, какой-то подписчик бросит исключение, то вся цепь отвалится.


Там много минусов по этому никто не осмеливается привести полный код. Вот тот что привели:

Observable<string[]> inputObservable = new Observable<string[]>();


Из какого пакета Observable с параметром?
Отредактировано 25.11.2019 17:23 Shmj . Предыдущая версия .
Re[12]: Reactive Extensions
От: Danchik Украина  
Дата: 25.11.19 19:05
Оценка: 6 (1)
Здравствуйте, Shmj, Вы писали:

[Skip]

S>Из какого пакета Observable с параметром?


Тут не важно, там должен был быть new Subject

Не претендую на супер знание Rx. Но родил такое:

using System;
using System.Collections.Generic;
using System.Reactive.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace RxForumSample
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            var observable = Observable.FromEventPattern(textBox1, "KeyUp");

            var cancelTokenSource = new CancellationTokenSource();

            var subscription = observable
                .Select(_ =>
                {
                    cancelTokenSource.Cancel();
                    cancelTokenSource = new CancellationTokenSource();
                    return cancelTokenSource;
                })
                .Throttle(TimeSpan.FromMilliseconds(500))
                .Select(async _ =>
                {
                    try
                    {
                        return await MakeRequest(textBox1.Text, _.Token);
                    }
                    catch (Exception exception)
                    {
                        Console.WriteLine(exception);
                        return null;
                    }
                })
                .Concat()
                .ObserveOn(textBox2)
                .Subscribe(items =>
                {
                    if (items != null)
                        textBox2.Text = string.Join("\r\n", items);
                });

        }

        
        Random _random = new Random();

        private async Task<List<string>> MakeRequest(string q, CancellationToken cancellationToken)
        {
            await Task.Delay(_random.Next(100, 5000), cancellationToken);

            Console.Beep(1000, 10);

            return await Task.FromResult(new List<string>()
            {
                q + " пункт 1 ",
                q + " пункт 2",
                q + " пункт 3",
            });

        }
    }
}


Заумно как на меня, разве что каждый день такое рожать.
Re[13]: Reactive Extensions
От: Shmj Ниоткуда  
Дата: 26.11.19 01:44
Оценка:
Здравствуйте, Danchik, Вы писали:

D>Не претендую на супер знание Rx. Но родил такое:

D>Заумно как на меня, разве что каждый день такое рожать.

Ага. Запустите анализатор кода VS — и получите, что с Rx 55 строк кода против 43 с Tasks. Т.е. строк кода получилось больше.

В чем же обещанная простота?

Многое не очевидно. Вот эта строчка, к примеру, зачем нужна:

.ObserveOn(textBox2)


Без нее все работает. Типа метод Invoke вызывает?

Короче говоря, эта штука для тех, у кого низкая самооценка и кто хочет как-то укрепиться за счет того, что типа использует что-то диковинное, что якобы не каждому под силу. На самом деле особо сложнго ничего нет — просто не удобно.
Re[14]: Reactive Extensions
От: _NN_ www.nemerleweb.com
Дата: 26.11.19 06:17
Оценка:
Здравствуйте, Shmj, Вы писали:

S>Здравствуйте, Danchik, Вы писали:


D>>Не претендую на супер знание Rx. Но родил такое:

D>>Заумно как на меня, разве что каждый день такое рожать.

S>Ага. Запустите анализатор кода VS — и получите, что с Rx 55 строк кода против 43 с Tasks. Т.е. строк кода получилось больше.


S>В чем же обещанная простота?

Вы простоту а количествах строк меняете ?
По этой логике Go супер сложный язык .


S>Многое не очевидно. Вот эта строчка, к примеру, зачем нужна:


S>
S>.ObserveOn(textBox2)
S>

Чтобы контекст вызова был на UI потоке

Когда нужно обрабаьваать реактивный поток данных удобно, что есть LINQ методы, и можно описать код декларативно.

Скажем, в вашем примере есть ещё счётчик ,который по хорошему следует инкапсулировать во вспомогательный класс, иначе логика обработки и обвязка размазываются .
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[10]: Reactive Extensions
От: Ночной Смотрящий Россия  
Дата: 26.11.19 08:03
Оценка:
Здравствуйте, Shmj, Вы писали:

S>А теперь вопрос: с чего вы взяли, что ваш код проще? Лишь потому что он записан в одну очень очень длинную строку?


Нет. Прежде всего потому что описывает что сделать, а не как сделать.
... << RSDN@Home 1.3.17 alpha 5 rev. 62>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.