Здравствуйте, 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",
});
}
}
}
Заумно как на меня, разве что каждый день такое рожать.