如何取消使用Rx调用的异步方法

本文关键字:Rx 调用 异步方法 何取消 取消 | 更新日期: 2023-09-27 17:57:56

我想知道如何取消''停止使用TakeUntil的反应式扩展调用的异步方法。

所以我想能够取消''停止以下方法:

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

如何取消使用Rx调用的异步方法

当您处理值时,Subscribe()的返回是IDisposable,如下所示:

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

订阅被停止。这真的会阻止潜在的图书Sevice搜索吗?这取决于执行情况。如果用Observable.Create完成,那么很有可能得到这种行为。

您必须告诉booksService取消搜索。Search方法开始搜索,并且还返回IObservable。当搜索完成时,将在IObservable上调用OnNextSearch中启动了一些异步代码,您需要取消这些代码。

我的建议是将搜索方法更改为以CancellationToken作为第二个参数的异步调用。然后,您可以通过Observable.ToAsync将其转换为Observable序列。对该Observable调用dispose将触发CancellationToken的取消。这样做可以让您轻松地将令牌传递到异步web调用等。

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();