Это старый поток, но только для справки в будущем, здесь есть более простой способ сделать это.
Если у вас есть CancellationToken, вы, вероятно, уже работаете с задачами.Итак, просто преобразуйте его в задачу и позвольте каркасу выполнить привязку:
using System.Reactive.Threading.Tasks;
...
var task = myObservable.ToTask(cancellationToken);
Это создаст внутреннего подписчика, который будет удален при отмене задачи.Это сделает свое дело в большинстве случаев, потому что большинство наблюдаемых производят значения только при наличии подписчиков.
Теперь, если у вас есть фактическая наблюдаемая, которую нужно по какой-то причине устранить (возможно, горячая наблюдаемая, которая больше не важна, если родительская задача отменена), это можно сделать с помощью продолжения:
disposableObservable.ToTask(cancellationToken).ContinueWith(t => {
if (t.Status == TaskStatus.Canceled)
disposableObservable.Dispose();
});