У меня есть вопрос по Observables (, который я разместил на подфоруме издателей для этой книги, но я все еще жду ответа).
Я использую вспомогательные методы, предоставленные какэто стандартная практика, а не ручная работа наблюдаемых.Однако, просто из академического интереса, я увидел, что нужно для создания наблюдаемого.
Я видел реализацию в книге, в которой в конце метода подписки был возвращен Disposable.Empty.Код выглядит примерно так:
public class MyObservable : IObservable<int>
{
public IDisposable Subscribe(IObserver<int> observer)
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
observer.OnNext(i);
}
observer.OnCompleted();
return Disposable.Empty;
}
}
Если я хочу вернуть правильный Disposable, который на самом деле приведет к отмене подписки, когда вызывается Dispose, как должно быть?
У меня был трескпри этом используя это для Observable и это для Observer
Мне пришлось ввести обработчик подписки
public class SubscriptionHandler : IDisposable
{
private readonly List<IObserver<int>> _listOfObservers;
private readonly IObserver<int> _currentObserver;
public SubscriptionHandler(List<IObserver<int>> currentListOfObservers, IObserver<int> currentObserver)
{
_listOfObservers = currentListOfObservers;
_currentObserver = currentObserver;
}
public void Dispose()
{
if (_currentObserver != null && _listOfObservers.Contains(_currentObserver))
{
_listOfObservers.Remove(_currentObserver);
}
}
}
Это код дляНаблюдаемое
public class MyObservable : IObservable<int>
{
private List<IObserver<int>> _listOfSubscribedObservers = new List<IObserver<int>>();
public IDisposable Subscribe(IObserver<int> observer)
{
if (!_listOfSubscribedObservers.Contains(observer))
{
_listOfSubscribedObservers.Add(observer);
}
Task.Run(() =>
{
for (int i = 0; i < 5; i++)
{
Thread.Sleep(1000);
observer.OnNext(i);
}
observer.OnCompleted();
});
return new SubscriptionHandler(_listOfSubscribedObservers, observer);
}
}
У меня такое ощущение, что я что-то упускаю.Должен быть встроенный способ возврата значимого Disposable для Observable, созданного вручную, или это что-то, что поставляется только с Observable методами создания помощника?
PS: Если при голосовании, пожалуйста, укажите причины в комментариях, чтобы я мог избежать повторенияошибки в задании вопроса.