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",
            });

        }
    }
}


Заумно как на меня, разве что каждый день такое рожать.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.