Observable.Timer(DateTimeOffset) Процесс Выход

У меня есть Observable.Timer(TimeSpan) несколько раз, но в нескольких местах я использовал Observable.Timer(DateTimeOffset), чтобы вызвать событие в это время, но я полагаю, что это мешает моему процессу завершиться.

DateTimeOffset offset = new DateTimeOffset(minStart);

Observable.Timer(offset)
   .Subscribe(_ =>
   {
      UpdateActive();
   });

Этот фрагмент кода находится в моей ViewModel и в Window Closed, процесс все еще выполняется в фоновом режиме, обычно везде, где я использую Observable.Timer(TimeSpan), они автоматически удаляются, почему бы и нет?

Я делаю что-то не так или это ошибка? Или я что-то упустил?

2 ответа

Учитывая, что вы используете один из Subscribe() Методы расширения, при условии, что вы используете последнюю версию RX, наблюдаемое должно выпускать любых подписчиков после его завершения. Ваша наблюдаемая завершена в одном случае, но не в другом?

Если ваша наблюдаемая еще не завершена (т.е. если время представлено offset еще не произошло) к тому времени, когда вы закроете окно, ничего не будет автоматически отписываться от вас. Вот что сайт introtorx должен сказать по этому вопросу (выделение мое):

Учитывая это, я подумал, что было бы разумно отметить, что подписки не будут автоматически уничтожаться. Вы можете с уверенностью предположить, что возвращенный вам экземпляр IDisposable не имеет финализатора и не будет собираться, когда он выходит из области видимости. Если вы вызываете метод Subscribe и игнорируете возвращаемое значение, вы потеряли свой единственный дескриптор для отказа от подписки. Подписка по-прежнему будет существовать, и вы фактически потеряли доступ к этому ресурсу, что может привести к утечке памяти и запуску нежелательных процессов.

Используя перегрузку Observable.Timer что принимает DateTimeOffset не будет сам по себе причиной процесса, который будет открыт; что-то еще отвечает за это.

Однако последствия отказа от подписки на Observable.Timer в том, что вы будете пропускать ресурс таймера.

Вы должны сохранить IDisposable дескрипторы подписок для наблюдаемых и основанных на событиях наблюдаемых объектов и располагают их соответствующим образом; большинство платформ WPF предоставляют подходящее событие для этого.

В общем, я отслеживаю и распоряжаюсь всеми своими подписками на уровне окна, просто чтобы быть в безопасности. См. Пример преобразования веб-службы опроса в RX.

Другие вопросы по тегам