Как отменить асинхронный метод, вызванный с помощью Rx - PullRequest
3 голосов
/ 31 мая 2011

Я хочу знать, как отменить \ остановить асинхронный метод, вызываемый с использованием реактивных расширений с использованием TakeUntil.

Поэтому я хочу иметь возможность отменить \ остановить следующий метод:

this.booksService.Search(searchText)
                 .ObserveOnDispatcher()
                 .Subscribe(results =>
                 {
                    this.books.Clear();
                    this.books.AddRange(results);
                 });

Ответы [ 3 ]

2 голосов
/ 31 мая 2011

Возвращение от Subscribe() - это IDisposable, когда вы утилизируете значение следующим образом:

var searchSub = this.booksService
                    .Search(searchText) ...
                    .Subscribe( ... );
// do something else
searchSub.Dispose();

подписка остановлена. Это действительно останавливает основной поиск booksSevice? Это зависит от реализации. Если все сделано w / Observable.Create, то вполне возможно получить такое поведение.

0 голосов
/ 15 июля 2014

Я рекомендую изменить метод поиска на асинхронный вызов, который принимает CancellationToken в качестве второго аргумента.Затем вы можете преобразовать это в наблюдаемую последовательность через Observable.ToAsync.Вызов dispose для этой наблюдаемой затем вызовет отмену CancellationToken.Это позволяет легко передавать токен на асинхронные веб-вызовы и т. Д.

public Task Search(string searchText, CancellationToken cancel)
{
    // Pass the token on to the async webclient request etc.
}

var searchSub = Observable.ToAsync(c => this.booksService.Search(searchText, c))
                .Subscribe( ... );
// do something else
searchSub.Dispose();
0 голосов
/ 31 мая 2011

Вы должны указать booksService, чтобы отменить поиск. Метод Search запускает поиск, а также возвращает IObservable. Когда поиск будет завершен, OnNext будет вызван на IObservable. В Search запущен некоторый асинхронный код, который необходимо отменить.

...