Nano Hash - криптовалюты, майнинг, программирование

C# Как перезапустить подписку RX

Предположим, у нас есть эта наблюдаемая последовательность (RX) и соответствующая подписка:

var behaviorSubject = new BehaviorSubject<int>(3);
var sequence = behaviorSubject.Select(x => this.webservice.Call(x)).Switch();
var subscription = this.sequence.Subscribe(this.Subject.OnNext, this.OnSequenceFaulted);

Последовательность предназначена для выполнения вызова веб-службы каждый раз, когда behaviorSubject выдает новое значение, при отмене предыдущих запросов. Если во время вызова веб-сервиса возникает исключение, подписка будет прекращена (после вызова метода OnSequenceFaulted).

Является ли хорошей практикой реализовать метод OnSequenceFaulted таким образом? Нужно ли перезапускать (переназначать) sequence, а также подписку, учитывая, что исключение возникло из наблюдаемого в sequence? И нужно ли явно удалять неисправную подписку?

public void OnSequenceFaulted(Exception e)
{
    subscription?.Dispose();
    subscription = sequence.Subscribe(this.Subject.OnNext, this.OnSequenceFaulted);
}
22.04.2017

Ответы:


1

Что касается хорошей практики, это действительно зависит от вашего варианта использования и того, что вы хотите, чтобы произошло, если webservice.Call выдает исключение.

Чтобы ответить на определенные части вашего вопроса, хотя вокруг rx есть несколько хороших ссылок Reactive Observable Subscription Disposal

Если наблюдаемое завершается — либо с OnCompleted, либо с OnError — тогда подписка уже утилизирована для вас.

introtorx содержит отличное описание различных методов обработки ошибок и того, что может применяться в вашем сценарии.

http://www.introtorx.com/content/v1.0.10621.0/11_AdvancedErrorHandling.html

Что касается того, как справиться с вашим конкретным сценарием, есть несколько вариантов, и вот лишь пара соображений.

  1. вы можете просто обработать исключение в самом веб-вызове, чтобы он не переводил поток в OnError http://www.introtorx.com/content/v1.0.10621.0/11_AdvancedErrorHandling.html#CatchSwallowingException

    var sequence = behaviorSubject.Select(x => this.webservice.Call(x)
              .Catch((Exception exc) => 
                   //do something with exception, 
                   //maybe just return an empty observable and log the exception
              ).Switch();
    
  2. Вы также можете просто сказать ему повторить попытку http://www.introtorx.com/content/v1.0.10621.0/11_AdvancedErrorHandling.html#Retry

    var subscription = this.sequence.Retry().Subscribe(this.Subject.OnNext, this.OnSequenceFaulted);
    

AFAIK, на самом деле, не является конкретной передовой практикой Rx. Это действительно то, что вы хотите, чтобы произошло, если произойдет исключение. Если вам все равно и вы просто хотите, чтобы он продолжал жить, тогда Retry в порядке. Если вы хотите поймать и зарегистрировать, вы можете поместить улов в вызов веб-сервиса. Если вы хотите проверить исключение, а затем разные исключения вызывают разные результаты, вы можете поместить разные уловки в вызов веб-сервиса.

22.04.2017
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..