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

问题描述

| 我想知道如何取消\停止使用asynchronous0ѭ使用反应式扩展的异步方法。 因此,我希望能够取消\\停止以下方法
this.booksService.Search(searchText)
                 .ObserveOndispatcher()
                 .Subscribe(results =>
                 {
                    this.books.Clear();
                    this.books.AddRange(results);
                 });
    

解决方法

        处置值时,
Subscribe()
的返回值为
IDisposable
,如下所示:
var searchSub = this.booksService
                    .Search(searchText) ...
                    .Subscribe( ... );
// do something else
searchSub.Dispose();
订阅已停止。这实际上会停止基础的“书籍服务”搜索吗?这取决于实现方式。如果用
Observable.Create
完成,那么很有可能会得到这种行为。     ,        您将不得不告诉
booksService
取消搜索。
Search
方法开始搜索,并且还返回
IObservable
。搜索完成后,将在
IObservable
上调用
OnNext
。在ѭ7中启动了一些异步代码,您需要取消这些代码。     ,        我的建议是将搜索方法更改为以CancellationToken作为第二个参数的异步调用。然后,您可以通过Observable.ToAsync将其转换为Observable序列。然后,在此可观察对象上调用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();
    

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...