Я хотел получить обзор кода следующей реализации Observable, потому что существует много мнений, и это может быть не самым эффективным. Хотелось бы услышать твои мысли.
Что я знаю
Я знаю, что лучше использовать
.Select
или.SelectMany
вместо того.Do
, потому что Do не поддерживает асинхронные делегаты, поскольку переданная лямбда имеет значение async void. Кроме того, Select и SelectMany обрабатывают исключения, чего не делает.я знаю это
Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1))
можно записать какObservable.Interval
. Здесь дело обстоит не так, это просто пример того, что, естественно, не будет удалено само по себе и должно обрабатываться вручную.Я использую
Subject<T>
вместо IDisposable, потому что я хочу иметь возможность сбросить подписку в какой-то момент, как и Вот (Сообщение @ Enigmativity).
Фрагмент
public class TestClass2 : IDisposable
{
private readonly Subject<IObservable<Unit>> _subject = new Subject<IObservable<Unit>>();
public void Test()
{
_subject.Switch().Subscribe();
var sub = Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1))
.SelectMany(_ => Observable.FromAsync(async () =>
{
Console.WriteLine("Test");
await Task.Delay(100);
}));
_subject.OnNext(sub);
}
public void Dispose()
{
_subject.OnNext(Observable.Never<Unit>());
Console.WriteLine("Disposed");
}
}