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

时间:2011-05-30 22:13:18

标签: c# .net system.reactive

我想知道如何使用TakeUntil取消使用被动扩展名取消的\ stop异步方法。

所以我希望能够取消\停止以下方法:

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

3 个答案:

答案 0 :(得分:2)

当您处置该值时,Subscribe()的返回值为IDisposable,如下所示:

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

订阅已停止。这实际上是否会阻止底层的booksSevice搜索?这取决于实施。如果用Observable.Create完成,则很有可能获得该行为。

答案 1 :(得分:0)

您必须告诉booksService取消搜索。 Search方法启动搜索并返回IObservable。搜索完成后,OnNext将调用IObservable。在Search中启动了一些您需要取消的异步代码。

答案 2 :(得分:0)

我的建议是将搜索方法更改为以CancellationToken作为第二个参数的异步调用。然后,您可以通过Observable.ToAsync将其转换为Observable序列。调用此可观察对象的处理将触发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();