Сбрасываемая асинхронная наблюдаемая подписка, которая не уничтожается естественным образом

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

Что я знаю

  1. Я знаю, что лучше использовать .Select или .SelectMany вместо того .Do, потому что Do не поддерживает асинхронные делегаты, поскольку переданная лямбда имеет значение async void. Кроме того, Select и SelectMany обрабатывают исключения, чего не делает.

  2. я знаю это Observable.Timer(TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(1)) можно записать как Observable.Interval. Здесь дело обстоит не так, это просто пример того, что, естественно, не будет удалено само по себе и должно обрабатываться вручную.

  3. Я использую 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");
    }
}

0

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *