Rx - отличный способ справиться с этой ситуацией. Он очень чистый.
Самая основная c перезапись вашего кода в вашем вопросе такова:
IObservable<Unit> observable =
from i in Observable.Interval(TimeSpan.FromHours(1))
from t in Observable.FromAsync(() => sampleMethod())
select t;
IDisposable subscription = observable.Subscribe();
Нет необходимости в токене отмены, так как вам просто нужно позвонить subscription.Dispose()
чтобы остановить эту подписку.
Однако, если ваш sampleMethod()
вызов был длительным, то вызов subscription.Dispose()
остановит наблюдаемое, но задача будет выполнена до конца. Если вы специально хотели остановить задачу, то для вызова этой задачи потребуется взять токен отмены и использовать его для остановки самого себя.
Ваш код вызова будет таким:
IObservable<Unit> observable =
from i in Observable.Interval(TimeSpan.FromHours(1))
from t in Observable.FromAsync(ct => sampleMethod(ct))
select t;
Единственное отличие состоит в том, что вызов FromAsync
передает CancellationToken
вызову sampleMethod
, который будет отменен при вызове subscription.Dispose()
.