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.